合并列但忽略NA。

3

我想将多个列粘合在一起,但忽略NAs。

这里是一个基本的工作示例,展示了数据框的外观以及我希望其看起来的样子。有人有什么技巧吗?

df <- data.frame("col1" = c("A", NA, "B", "C"),
                 "col2" = c(NA, NA, NA, "E"),
                 "col3" = c(NA, "D", NA, NA),
                 "col4" = c(NA, NA, NA, NA))

df_fixed <- data.frame("col" = c("A", "D", "B", "C,E"))
4个回答

2

使用 paste 命令。

data.frame(col1=sapply(apply(df, 1, \(x) x[!is.na(x)]), paste, collapse=','))
#   col1
# 1    A
# 2    D
# 3    B
# 4  C,E

或者不使用 apply

data.frame(col1=unname(as.list(as.data.frame(t(df))) |>
             (\(x) sapply(x, \(x) paste(x[!is.na(x)], collapse=',')))()))
#   col1
# 1    A
# 2    D
# 3    B
# 4  C,E

要添加为列,请使用transform
transform(df, colX=sapply(apply(df, 1, \(x) x[!is.na(x)]), paste, collapse=','))
#   col1 col2 col3 col4 colX
# 1    A <NA> <NA>   NA    A
# 2 <NA> <NA>    D   NA    D
# 3    B <NA> <NA>   NA    B
# 4    C    E <NA>   NA  C,E

注意:实际上,你也可以用na.omit替换\(x) x[!is.na(x)],因为它的属性会消失;请参见例如@ G. Grothendieck答案


谢谢!如果我想将其保存为数据框中的新列,语法是什么样的?以下语句返回df$col1.col1df$col1 <- data.frame(col1=sapply(apply(df[1:4], 1, (x) x[!is.na(x)]), paste, collapse=',')) - user9974638
@user9974638 使用 transform,请查看更新。 - jay.sf
1
完美的,谢谢! - user9974638

1
我们可以使用unite函数,它可以带有na.rm参数。
library(tidyr)
library(dplyr)
df %>% 
   unite(col, everything(), na.rm = TRUE, sep=",")

-输出

  col
1   A
2   D
3   B
4 C,E

或者使用base R结合do.calltrimws函数。
data.frame(col = trimws(do.call(paste, c(df, sep = ",")),
      whitespace = "(?:,?NA,?)+"))

-输出

  col
1   A
2   D
3   B
4 C,E

1
使用 na.omit 和 toString。不需要使用任何软件包。
data.frame(col = apply(df, 1, function(x) toString(na.omit(x)))
##    col
## 1    A
## 2    D
## 3    B
## 4 C, E

如果输出中的空格成为问题,请使用以下其中一个替代匿名函数:

function(x) paste(na.omit(x), collapse = ",") 
function(x) gsub(", ", ",", toString(na.omit(x)))

我有这个想法,但逗号后面有一个空格,与预期结果不同。 - jay.sf
不清楚那是否真的重要,但我加了一些备选方案以防万一。 - G. Grothendieck

1
一种可能的R语言基本解决方案:
df2 <- data.frame(col=apply(df,1, function(x) paste0(na.omit(x), collapse = ",")))

df2

#>   col
#> 1   A
#> 2   D
#> 3   B
#> 4 C,E

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接