您好我需要按多个列的组连接字符串。我发现这个问题的版本已被多次询问(参见Aggregating by unique identifier and concatenating related values into a string),但它们通常涉及连接单个列的值。
我的数据集类似于:
Sample group Gene1 Gene2 Gene3
A 1 a NA NA
A 2 b NA NA
B 1 NA c NA
C 1 a NA d
C 2 b NA e
C 3 c NA NA
我想把它变成一种格式,每个样本只需要1行(组列是可选的):
Sample group Gene1 Gene2 Gene3
A 1,2 a,b NA NA
B 1 NA c NA
C 1,2,3 a,b,c NA d,e
由于基因数量可以达到数千,我不能简单地指定我希望连接的列。
我知道可以使用aggregate
或dplyr
来获取组,但我无法弄清楚如何为多个列执行此操作。
提前致谢!
由于我的数据集非常庞大,包含数千个基因,因此我发现dplyr太慢了。我一直在尝试使用data.table,下面的代码也可以得到我想要的东西:
setDT(df)[, lapply(.SD, function(x) paste(na.omit(x), collapse = ",")), by = Sample]
输出现在是:
Sample group Gene1 Gene2 Gene3
1: A 1,2 a,b
2: B 1 c
3: C 1,2,3 a,b,c d,e
感谢您的帮助!
答案 0 :(得分:2)
出于这些目的,有summarise_all
,summarise_at
和summarise_if
函数。使用summarise_all
:
df %>%
group_by(Sample) %>%
summarise_all(funs(paste(na.omit(.), collapse = ",")))
# A tibble: 3 × 5 Sample group Gene1 Gene2 Gene3 <chr> <chr> <chr> <chr> <chr> 1 A 1,2 a,b 2 B 1 c 3 C 1,2,3 a,b,c d,e
答案 1 :(得分:1)
使用dplyr
,您可以尝试:
dft %>%
group_by(Sample) %>%
summarise_each(funs( toString(unique(.))))
给出:
# A tibble: 3 × 5
Sample group Gene1 Gene2 Gene3
<chr> <chr> <chr> <chr> <chr>
1 A 1, 2 a, b NA NA
2 B 1 NA c NA
3 C 1, 2, 3 a, b, c NA d, e, NA
编辑:
@Axeman有正确的想法使用na.omit(.)
来摆脱空值