[英]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.