我有一个数据集,在所有列中都有数字和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的合并功能
digital_metrics_FB <- fb_all_data %>%
mutate(fb_metrics = coalesce("v1",
"v2",
"v3",
"v4",
"v5"))
并尝试了Apply函数
df2 <- sapply(fb_all_data,function(x) x[!is.na(x)])
仍然无法使其正常工作。
我正在寻找最终结果,使所有非NA值都出现在最后一列中,并且保留行名
final
a 1
b 2
c 3
d 4
e 5
任何帮助将不胜感激
答案 0 :(得分:1)
我们可以使用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
或对多个非NA元素使用tidyverse
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"))
答案 1 :(得分:1)
使用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)