繁体   English   中英

将列粘贴在一起但忽略 NA

[英]Paste together columns but ignore NAs

我想将多个列粘贴在一起但忽略 NA。

这是 df 看起来像什么以及我希望它看起来像什么的基本工作示例。 有没有人有任何提示?

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"))

我们可以使用可以有na.rm作为参数的unite

library(tidyr)
library(dplyr)
df %>% 
   unite(col, everything(), na.rm = TRUE, sep=",")

-输出

  col
1   A
2   D
3   B
4 C,E

或者使用带有do.calltrimwsbase R R

data.frame(col = trimws(do.call(paste, c(df, sep = ",")),
      whitespace = "(?:,?NA,?)+"))

-输出

  col
1   A
2   D
3   B
4 C,E

使用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

注意:实际上,您也可以将\(x) x[.is.na(x)])替换为na.omit ,因为它的属性消失了; 参见例如@G. Grothendieck回答

一个可能的基础 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

使用 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

如果 output 中的空格有问题,请使用其中之一,而不是显示的匿名 function:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM