我有多个变量通过前缀(par___、fri___、gp___等(组合在一起,其中有29个组。
每个变量都有一个值0或1。我需要做的是对这些组(即,partner__1+partner__2等(求和,如果rowSums=0,则使每个变量为NA.
例如。我的数据如下:
par___ | par__2 | fri__1 | fri___2|
---|---|---|---|
0 | 0 | 1 | <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