我有一个dataframe,它有变量component1_done、component2_done等等。例如,我想将每一份表列为:
proportions(table(df$component1_done))
proportions(table(df$component2_done))
proportions(table(df$component3_done))
proportions(table(df$component4_done))
proportions(table(df$component5_done))
proportions(table(df$component6_done))我如何使用循环来做同样的事情?换句话说,如何在循环中引用df$component"i"_done?
谢谢!
发布于 2021-12-30 23:52:32
为此您可以使用lapply。结果是所有列的比例列表。
df <- data.frame(a=c(1,2,2,4,5), b=c(3,4,5,6,6))
lapply(df, function(x) proportions(table(x)))
$a
x
1 2 4 5
0.2 0.4 0.2 0.2
$b
x
3 4 5 6
0.2 0.2 0.2 0.4用dplyr
library(dplyr)
as.list(df %>% summarise(across(everything(), ~ proportions(table(.x)))))
$a
a
1 2 4 5
0.2 0.4 0.2 0.2
$b
b
3 4 5 6
0.2 0.2 0.2 0.4发布于 2021-12-31 03:33:34
太感谢你了安德烈!你的当然要漂亮得多,但与此同时,我也一直在努力使用循环。我们的答案是使用更长的格式。
for (i in 1:6){
df0 <- df %>% filter(answerindex==8)
char <- paste0("component",i,"_done")
df0 <- df0 %>% select("username",all_of(char))
df0_longer <- pivot_longer(df0, col = -c(username), names_to = "component", values_to = "done")
t <- proportions(table(df0_longer$done))
print(t)
}这是可行的,但我很不高兴,因为这比原来的六行长;)
发布于 2021-12-31 03:40:13
如果您真的想使用一个循环,您可以使用
df <- data.frame(a=c(1,2,2,4,5), b=c(3,4,5,6,6))
for (i in seq_along(names(df))){
print(proportions(table(df[,i])))
}循环不打印,除非你说要。
或者,您可以将每个表分配给列表,然后打印该列表。
tables <- list()
for (i in seq_along(names(df))){
tables[[i]] <- proportions(table(df[,i]))
}
tableshttps://stackoverflow.com/questions/70537739
复制相似问题