在 R 中使用动态变量寻址另一个数据帧(理想情况下是 dplyr,使用 mutate)
Addressing another dataframe with dynamic variables in R (ideally dplyr, using mutate)
我已经阅读了各种关于动态命名变量的帖子,但我找不到答案。
我有两个数据框。
df <- data.frame(qno=c(1,2,3,4))
ref <- data.frame(Q1 = c(1:20),Q2 = c(21:40),Q3=c(41:60),Q4 = c(61:80))
现在我想在 df 数据框中创建另一列 'average',它给出了 ref 中每列的平均值。
预期输出:
df <- data.frame(qno=c(1,2,3,4), average = c(10.5,30.5,50.5,70.5))
这是我尝试过的:
df <- df %>%
mutate(average := mean(!!as.name(paste0("ref$Q",qno)))
我也试过带 for 循环的版本,但也没用。
for (i in 1:length(df$qno)){
df$average[i] <- mean(as.name(paste0("ref$Q",df$qno[i])))
}
df <- df %>%
mutate(average = mean(as.name(paste0("ref$Q",qno))))```.
这是否解决了您的问题?
ref <- data.frame(Q1 = c(1:20),Q2 = c(21:40),Q3=c(41:60),Q4 = c(61:80))
out <- data.frame(qno=c(1,2,3,4), average = c(10.5,30.5,50.5,70.5))
df <- data.frame(qno=c(1:length(ref)))
for (i in seq_along(ref)) {
df$average[i] <- mean(ref[[i]], na.rm = T)
}
我不太确定你是否想像变量一样命名行,所以你可以在创建 df 对象时添加它:
df <- data.frame(qno = paste0("Q", c(1:length(ref))))
这是 mutate
:
df %>% mutate(average = t(ref %>% summarise(across(everything(), ~mean(.x, na.rm = TRUE)))))
qno average
1 1 10.5
2 2 30.5
3 3 50.5
4 4 70.5
但是如果您想要 ref
:
中的名称,则完全可以在不使用 mutate
的情况下使用它
t(ref %>% summarise(across(everything(), list(mean), .names = "{.col}"))) %>%
data.frame() %>%
rename(average = 1)
average
Q1 10.5
Q2 30.5
Q3 50.5
Q4 70.5
我已经阅读了各种关于动态命名变量的帖子,但我找不到答案。
我有两个数据框。
df <- data.frame(qno=c(1,2,3,4))
ref <- data.frame(Q1 = c(1:20),Q2 = c(21:40),Q3=c(41:60),Q4 = c(61:80))
现在我想在 df 数据框中创建另一列 'average',它给出了 ref 中每列的平均值。 预期输出:
df <- data.frame(qno=c(1,2,3,4), average = c(10.5,30.5,50.5,70.5))
这是我尝试过的:
df <- df %>%
mutate(average := mean(!!as.name(paste0("ref$Q",qno)))
我也试过带 for 循环的版本,但也没用。
for (i in 1:length(df$qno)){
df$average[i] <- mean(as.name(paste0("ref$Q",df$qno[i])))
}
df <- df %>%
mutate(average = mean(as.name(paste0("ref$Q",qno))))```.
这是否解决了您的问题?
ref <- data.frame(Q1 = c(1:20),Q2 = c(21:40),Q3=c(41:60),Q4 = c(61:80))
out <- data.frame(qno=c(1,2,3,4), average = c(10.5,30.5,50.5,70.5))
df <- data.frame(qno=c(1:length(ref)))
for (i in seq_along(ref)) {
df$average[i] <- mean(ref[[i]], na.rm = T)
}
我不太确定你是否想像变量一样命名行,所以你可以在创建 df 对象时添加它:
df <- data.frame(qno = paste0("Q", c(1:length(ref))))
这是 mutate
:
df %>% mutate(average = t(ref %>% summarise(across(everything(), ~mean(.x, na.rm = TRUE)))))
qno average
1 1 10.5
2 2 30.5
3 3 50.5
4 4 70.5
但是如果您想要 ref
:
mutate
的情况下使用它
t(ref %>% summarise(across(everything(), list(mean), .names = "{.col}"))) %>%
data.frame() %>%
rename(average = 1)
average
Q1 10.5
Q2 30.5
Q3 50.5
Q4 70.5