我有一个示例数据集,如下所示:
var_a <- vector(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, ....)
# var1 to var8 are vectors that contain pseudorandom numbers between 1 and 20 (unlike var_a not in any particular order).
data <- data.frame(cbind(var_a, var1, var2, var3, var4, var5, var6, var7, var8))
我想使用列变量"var_a“(它实际上包含1-127的数字)循环遍历这个数据集。对于var_a中的每个数字,我想要计算"var1“到"var8”中数字的8x8相关矩阵,并将127个相关矩阵存储在一个列表中。
我使用tidyverse管道计算了var_a=1的第一个相关矩阵:
data %>%
filter(var_a==1) %>%
select("var1", "var2", "var3", "var4", "var5", "var6", "var7", "var8")%>%
cor()
现在我最困难的部分是计算var_a=1,var_a=2,var_a=3,…,var_a=127的相关矩阵,并将这些矩阵存储在一个列表中。
我的尝试如下,但我仍然停留在循环遍历和存储相关矩阵的部分:
n <- 127
corlist <- list()
for (i in 1:n) {
data %>%
filter(var_a==i) %>%
select("var1", "var2", "var3", "var4", "var5", "var6", "var7", "var8") %>%
corlist[i] <- cor()
}
"Error in is.data.frame(x) : argument "x" is missing, with no default"
我是否需要首先为cor()定义一个函数,然后将其集成到管道和循环中?
非常感谢帮助/文献/链接!非常感谢!
发布于 2019-01-15 04:01:04
你不需要一个循环。正如注释中已经提到的,您可以使用group_by
。
library(tidyverse)
my.df.cor <- my.df %>%
group_by(var_a) %>%
nest() %>% # Stores var1 to var8 in a dataframe for each var_a
mutate(cor = map(data, cor)) # apply the function cor() to this data for each var_a
my.df.cor
# A tibble: 3 x 3
# var_a data cor
# <dbl> <list> <list>
# 1 1 <tibble [8 x 8]> <dbl [8 x 8]>
# 2 2 <tibble [8 x 8]> <dbl [8 x 8]>
# 3 3 <tibble [8 x 8]> <dbl [8 x 8]>
您收到一个包含3列的tibble,其中数据存储var1到var8的每个var_a和cor对应的相关矩阵。
pull(my.df.cor, cor)
给你想要的名单。
您可以用
n <- 3
corlist <- list()
for (i in 1:n) {
corlist[[i]] <- my.df %>%
filter(var_a == i) %>%
select("var1", "var2", "var3", "var4", "var5", "var6", "var7", "var8") %>%
cor()
}
代码中的问题是,管道将data.frame作为下一行的第一个参数插入,但是在那里尝试执行赋值,因此cor()
没有得到参数。我把赋值放在第一位,然后把要分配给列表条目的内容(用[[i]]
而不是[i]
索引)
数据
var_a <- c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3)
set.seed(42)
my.df <- data.frame(var_a = var_a,
var1 = sample(1:20, length(var_a), replace = TRUE),
var2 = sample(1:20, length(var_a), replace = TRUE),
var3 = sample(1:20, length(var_a), replace = TRUE),
var4 = sample(1:20, length(var_a), replace = TRUE),
var5 = sample(1:20, length(var_a), replace = TRUE),
var6 = sample(1:20, length(var_a), replace = TRUE),
var7 = sample(1:20, length(var_a), replace = TRUE),
var8 = sample(1:20, length(var_a), replace = TRUE))
https://stackoverflow.com/questions/54198131
复制