![](/img/trans.png)
[英]Paste together strings which come from names that fit a pattern and ignore NAs
[英]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.call
和trimws
的base 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.