【问题标题】:combine rows in r, summing values and concatenating characters; combining factor levels合并 r 中的行、求和值和连接字符;组合因子水平
【发布时间】:2019-11-03 01:47:38
【问题描述】:

我想组合两行或多行,以便将变量 (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]

【问题讨论】:

  • d, e ,f 和 l, k, s 是独特的因子水平,所以我想说“将因子水平 f 和 s 组合成一个新的因子水平 fs”,它将连接另一个(字符) 因子水平并将整数值相加到一个新的单行中,同时删除它组合的前两行。这可能是一个管道函数,您可以将两行通过管道连接到一个新行中吗?

标签: r sum concatenation aggregate


【解决方案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)

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这将对所有行执行此操作。我认为他们希望每 n 行都这样做......
    猜你喜欢
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    相关资源
    最近更新 更多