删除 NA 值并将非 NA 值合并到一个列中
remove NA values and combine non NA values into a single column
我有一个数据集,它的所有列都有数值和 NA 值。我想创建一个包含所有非 NA 值的新列并保留行名称
v1 v2 v3 v4 v5
a 1 NA NA NA NA
b NA 2 NA NA NA
c NA NA 3 NA NA
d NA NA NA 4 NA
e NA NA NA NA 5
我试过使用 dplyr 的 coalesce 函数
digital_metrics_FB <- fb_all_data %>%
mutate(fb_metrics = coalesce("v1",
"v2",
"v3",
"v4",
"v5"))
并且还尝试了一个应用函数
df2 <- sapply(fb_all_data,function(x) x[!is.na(x)])
仍然无法正常工作。
我正在寻找最终结果,所有非 NA 值都在最后一列中,并且行名称被保留
final
a 1
b 2
c 3
d 4
e 5
任何帮助将不胜感激
我们可以使用pmax
do.call(pmax, c(fb_all_data , na.rm = TRUE))
如果有多个非 NA 元素并且想要合并为一个字符串,一个简单的 base R
选项是
data.frame(final = apply(fb_all_data, 1, function(x) toString(x[!is.na(x)])))
或使用coalesce
library(dplyr)
library(tibble)
fb_all_data %>%
rownames_to_column('rn') %>%
transmute(rn, final = coalesce(v1, v2, v3, v4, v5)) %>%
column_to_rownames('rn')
# final
#a 1
#b 2
#c 3
#d 4
#e 5
或使用 tidyverse
,用于多个非 NA 元素
fb_all_data %>%
rownames_to_column('rn') %>%
transmute(rn, final = pmap_chr(.[-1], ~ c(...) %>%
na.omit %>%
toString)) %>%
column_to_rownames('rn')
注意:这里我们显示的是 OP 作为示例显示的数据,而不是其他数据集
数据
fb_all_data <- structure(list(v1 = c(1L, NA, NA, NA, NA), v2 = c(NA, 2L, NA,
NA, NA), v3 = c(NA, NA, 3L, NA, NA), v4 = c(NA, NA, NA, 4L, NA
), v5 = c(NA, NA, NA, NA, 5L)), class = "data.frame",
row.names = c("a",
"b", "c", "d", "e"))
使用 tidyverse
,您可以:
df %>%
rownames_to_column() %>%
gather(var, val, -1, na.rm = TRUE) %>%
group_by(rowname) %>%
summarise(val = paste(val, collapse = ", "))
rowname val
<chr> <chr>
1 a 1
2 b 2, 3
3 c 3
4 d 4
5 e 5
具有多个非 NA 值的行的示例数据:
df <- read.table(text = " v1 v2 v3 v4 v5
a 1 NA NA NA NA
b NA 2 3 NA NA
c NA NA 3 NA NA
d NA NA NA 4 NA
e NA NA NA NA 5", header = TRUE)
我有一个数据集,它的所有列都有数值和 NA 值。我想创建一个包含所有非 NA 值的新列并保留行名称
v1 v2 v3 v4 v5
a 1 NA NA NA NA
b NA 2 NA NA NA
c NA NA 3 NA NA
d NA NA NA 4 NA
e NA NA NA NA 5
我试过使用 dplyr 的 coalesce 函数
digital_metrics_FB <- fb_all_data %>%
mutate(fb_metrics = coalesce("v1",
"v2",
"v3",
"v4",
"v5"))
并且还尝试了一个应用函数
df2 <- sapply(fb_all_data,function(x) x[!is.na(x)])
仍然无法正常工作。
我正在寻找最终结果,所有非 NA 值都在最后一列中,并且行名称被保留
final
a 1
b 2
c 3
d 4
e 5
任何帮助将不胜感激
我们可以使用pmax
do.call(pmax, c(fb_all_data , na.rm = TRUE))
如果有多个非 NA 元素并且想要合并为一个字符串,一个简单的 base R
选项是
data.frame(final = apply(fb_all_data, 1, function(x) toString(x[!is.na(x)])))
或使用coalesce
library(dplyr)
library(tibble)
fb_all_data %>%
rownames_to_column('rn') %>%
transmute(rn, final = coalesce(v1, v2, v3, v4, v5)) %>%
column_to_rownames('rn')
# final
#a 1
#b 2
#c 3
#d 4
#e 5
或使用 tidyverse
,用于多个非 NA 元素
fb_all_data %>%
rownames_to_column('rn') %>%
transmute(rn, final = pmap_chr(.[-1], ~ c(...) %>%
na.omit %>%
toString)) %>%
column_to_rownames('rn')
注意:这里我们显示的是 OP 作为示例显示的数据,而不是其他数据集
数据
fb_all_data <- structure(list(v1 = c(1L, NA, NA, NA, NA), v2 = c(NA, 2L, NA,
NA, NA), v3 = c(NA, NA, 3L, NA, NA), v4 = c(NA, NA, NA, 4L, NA
), v5 = c(NA, NA, NA, NA, 5L)), class = "data.frame",
row.names = c("a",
"b", "c", "d", "e"))
使用 tidyverse
,您可以:
df %>%
rownames_to_column() %>%
gather(var, val, -1, na.rm = TRUE) %>%
group_by(rowname) %>%
summarise(val = paste(val, collapse = ", "))
rowname val
<chr> <chr>
1 a 1
2 b 2, 3
3 c 3
4 d 4
5 e 5
具有多个非 NA 值的行的示例数据:
df <- read.table(text = " v1 v2 v3 v4 v5
a 1 NA NA NA NA
b NA 2 3 NA NA
c NA NA 3 NA NA
d NA NA NA 4 NA
e NA NA NA NA 5", header = TRUE)