R使用mutate为多组变量求和,使用变量名前缀为循环求和



我有多个变量通过前缀(par___、fri___、gp___等(组合在一起,其中有29个组。

每个变量都有一个值0或1。我需要做的是对这些组(即,partner__1+partner__2等(求和,如果rowSums=0,则使每个变量为NA.

例如。我的数据如下:

fri___2<1>
par___ par__2 fri__1
0 0 1
0
0 0 1 0
0 0 0

tidyverse选项为:

df %>%
stack() %>%
group_by(ind) %>%
group_by(grp = row_number(), grp2 = str_remove(ind, "_.*")) %>%
mutate(values = values + na_if(all(values==0), 1)) %>%
pivot_wider(grp, ind, values_from = values)

# A tibble: 4 x 5
# Groups:   grp [4]
grp par___1 par___2 fri___1 fri___2
<int>   <int>   <int>   <int>   <int>
1     1      NA      NA       1       1
2     2       0       1      NA      NA
3     3      NA      NA       1       0
4     4      NA      NA      NA      NA

如果在另一方面,你会喜欢基地R,那么你可以做:

d <- ave(unlist(df), row(df), sub("_.*", "", names(df))[col(df)], FUN = function(x) x * NA ^ all(x==0))
array(d, dim(df), dimnames(df))
par___1 par___2 fri___1 fri___2
1      NA      NA       1       1
2       0       1      NA      NA
3      NA      NA       1       0
4      NA      NA      NA      NA

请注意,最后一个是矩阵,您可以将其转换为数据帧。

使用split.default:的基本R选项

do.call(cbind, unname(lapply(split.default(df, 
sub('(\w+)_.*', '\1', names(df))), function(x) {
x[rowSums(x) == 0, ] <- NA
x
})))
#  fri___1 fri___2 par___ par___2
#1       1       1     NA      NA
#2      NA      NA      0       1
#3       1       0     NA      NA
#4      NA      NA     NA      NA

最新更新