簡體   English   中英

合並 r 中的行,求和值並連接字符; 結合因子水平

[英]combine rows in r, summing values and concatenating characters; combining factor levels

我想組合兩行或更多行,以便對變量 (v1..5) 的數值求和,並將作為因子級別的字符值組合如下:

R1, 0 1 1 1 1 , 定義
R2, 1 3 0 1 2 , lks

結合 R1 和 R2

R1R2, 2 4 1 2 3 dl ek fs

[在此處輸入圖片說明][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)

使用基本 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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM