合并r中的行,对值求和并连接字符;综合因素水平

时间:2019-06-20 09:07:36

标签: r sum concatenation aggregate

我想合并两行或更多行,以便将变量(v1..5)的数值相加,并将因子级别的字符值相结合,如下所示:

R1,0 1 1 1 1,d e f
R2,1 3 0 1 2,l k s

结合R1和R2

R1R2,2 4 1 2 3 dl ek fs

[在此处输入图片描述] [1]

2 个答案:

答案 0 :(得分:1)

一种dplyr可能是:

df %>%
 group_by(group = gl(n()/2, 2)) %>%
 mutate_at(vars(starts_with("v")), sum) %>%
 mutate_at(vars(starts_with("f")), toString) %>%
 summarise_all(first) %>%
 ungroup() %>%
 select(-group)

     v1    v2    v3    v4    v5 fa    fb    fc   
  <int> <int> <int> <int> <int> <chr> <chr> <chr>
1     2     4     1     2     3 d, l  e, k  f, s 

此处将每两行分配到同一组中,对以v开头的变量求和,并连接以f开头的变量。

或基于变量类的相同:

df %>%
 group_by(group = gl(n()/2, 2)) %>%
 mutate_if(is.numeric, sum) %>%
 mutate_if(is.character, toString) %>%
 summarise_all(first) %>%
 ungroup() %>%
 select(-group)

答案 1 :(得分:0)

使用基数R lapply,我们可以检查列的类别并采取相应措施

data.frame(lapply(df, function(x) 
                 if(is.numeric(x)) sum(x) else paste0(x, collapse = "")))

#  v1 v2 v3 v4 v5 fa fb fc
#1  2  4  1  2  3 dl ek fs

如果我们想对每n行执行此操作,则可以使用aggregate

n <- 2
aggregate(.~rep(seq_len(nrow(df)), each  = n, length.out = nrow(df)), df, 
            function(x) if(is.numeric(x)) sum(x) else paste0(x, collapse = ""))[-1]