我有一个数据集,其变量名为I10AA至I10ZZ和I11AA至I11ZZ。我想为IZZ创建新的变量IAA,以便IAA = function(I10AA,I11AA)。
作为一个高度简化的示例。
set.seed(0)
df <- data.frame(I10AA=floor(runif(10,1,5)),I10AB=floor(runif(10,1,5)),
I11AA=floor(runif(10,1,5)),I11AB=floor(runif(10,1,5)))
fun <- function(x,y) (x+y)
results <- df %>% mutate(IAA = fun(I10AA,I11AA),IAB = fun(I10AB,I11AB))
print(results)
结果是我想要的最终数据集。
有没有办法用tidyverse做到这一点?
在原始数据集中,变量的排列方式为:
colnames(original_data) = "ID","I1AA", "I1AB", "I1AC", ... , "I1ZZ", "I2AA","I2AB",...,"I2ZZ",...,"I10AA",...,"I10ZZ","I11AA",..."I11ZZ"
答案 0 :(得分:1)
我们可以遍历列名,使用location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
创建新列,使用列名的子字符串重命名列并与原始数据绑定
transmute
或者另一个选择是将数据集的子集放置在library(tidyverse)
i1 <- grepl("10", names(df))
nm1 <- sub("\\d+", "", names(df)[i1])
i2 <- !i1
map2(names(df)[i1], names(df)[i2], ~
df %>%
transmute(fun(!! rlang::sym(.x), !!rlang::sym(.y)))) %>%
bind_cols %>%
rename_all(., ~ nm1) %>%
bind_cols(df, .)
# I10AA I10AB I11AA I11AB IAA IAB
#1 4 1 4 2 8 3
#2 2 1 4 2 6 3
#3 2 1 1 3 3 4
#4 3 3 3 2 6 5
#5 4 2 1 1 5 3
#6 1 4 2 4 3 8
#7 4 2 2 3 6 5
#8 4 3 1 4 5 7
#9 3 4 2 1 5 5
#10 3 2 4 3 7 5
中,并使用list
传递reduce
+
一个更简单的选择是
list(df %>%
select(names(.)[i1]),
df %>%
select(names(.)[i2])) %>%
reduce(`+`) %>%
rename_all(., ~ nm1) %>%
bind_cols(df, .)