r - 使用 dplyr 将多列逐行组合成向量
问题描述
我正在尝试将每行的多个列组合成一个单元格,然后删除缺失值。
样本数据:
df <- data.frame(a=c("a", "b", "c", "d"),
b=c(NA, "a", "b", "c"),
c=c("a", "b", "e", "g"))
试图:
df %>% rowwise() %>%
mutate(collapse=as.character(paste(a,b,c, collapse=",")),
collapse_nona=na.omit(collapse))
输出:
# A tibble: 4 x 5
a b c collapse collapse_nona
* <fct> <fct> <fct> <chr> <chr>
1 a NA a a NA a,b a b,c b e,d c… a NA a,b a b,c b e,d …
2 b a b a NA a,b a b,c b e,d c… a NA a,b a b,c b e,d …
3 c b e a NA a,b a b,c b e,d c… a NA a,b a b,c b e,d …
4 d c g a NA a,b a b,c b e,d c… a NA a,b a b,c b e,d …
1)我没有成功地为每一行创建具有值的单元格(整列出现在折叠中)。
2) 折叠列中的单元格的行为不像向量。
期望的输出
a b c collapse collapse_nona
* <fct> <fct> <fct> <chr> <chr>
1 a NA a a NA a a a
2 b a b b a b b a b
3 c b e c b e c b e
4 d c g d c g d c g
谢谢
解决方案
使用unite
, 有一个选项,na.rm
默认为 FALSE
library(tidyr)
library(dplyr)
df %>%
mutate_all(as.character) %>%
unite(collapse, a, b,c, remove = FALSE, sep=" ") %>%
unite(collapse_nona, a, b, c, remove = FALSE, sep=" ", na.rm = TRUE) %>%
select(names(df), everything())
# a b c collapse collapse_nona
#1 a <NA> a a NA a a a
#2 b a b b a b b a b
#3 c b e c b e c b e
#4 d c g d c g d c g
Or with paste
and str_remove_all
(from stringr
) - 注意它paste/str_c
是矢量化的,所以不需要遍历每一行rowwise
df %>%
mutate(collapse = paste(a, b, c),
collapse_nona = str_remove_all(collapse, "\\sNA|NA\\s"))
# a b c collapse collapse_nona
#1 a <NA> a a NA a a a
#2 b a b b a b b a b
#3 c b e c b e c b e
#4 d c g d c g d c g
另一种选择是pmap
遍历每一行,然后使用 and或(from )删除NA
元素na.omit
paste
str_c
stringr
library(dplyr)
library(stringr)
library(purrr)
df %>%
mutate_all(as.character) %>%
mutate(collapse_nona = pmap_chr(., ~ c(...) %>%
na.omit %>%
str_c(collapse=" ")))
# a b c collapse_nona
#1 a <NA> a a a
#2 b a b b a b
#3 c b e c b e
#4 d c g d c g
推荐阅读
- javascript - 由于 broccoliBuilderError,Ember 构建失败
- objective-c - 如何在 CFPreferencesSetAppValue 中设置整数?
- c# - 使用 Bouncy Castle 使用 CAdES-BES 签署文件
- slack - 自动更改肤色
- dotnetnuke - 如何摆脱 2sxc 模块中的 405 错误?
- mysql - 当我尝试更新记录时,我收到错误 #1062 - 键“ID_UNIQUE”的重复条目
- javascript - 无法使用平均堆栈获取 req.body 的数据
- clickhouse - 使用数组计算上一个和下一个值
- swift - NSLocalizedDescription=不允许写入
- r - 为什么矩阵和data.frame之间的“越界”索引不同?