我有一些这样的数据集;
mydata1_sorted <- data.frame(Col1 = runif(3,1,5),
Col2 = runif(3,1,5),
Col3 = runif(3,1,5))
mydata2_sorted <- data.frame(Col1 = runif(2,1,3),
Col2 = runif(2,1,3),
Col3 = runif(2,1,3))
mydata3_sorted <- data.frame(Col1 = runif(2,1,6),
Col2 = runif(2,1,6),
Col3 = runif(2,1,6))
我使用expand.grid
函数,如下所示,它工作正常。
expand.grid(mydata1_sorted$Col1, mydata2_sorted$Col1, mydata3_sorted$Col1)
但是,由于某些原因,我需要在下面的列表中应用相同的功能。
datalist <- list( group1=c("mydata1","mydata2","mydata3"),
group2 = c("mydata2","mydata3"),
group3 = c("mydata1","mydata3"))
为此,我编写了以下代码;
for(i in 1:length(datalist)) {
list_sorted <- paste0(datalist[[i]],"_sorted$Col1")
to_function <-noquote(paste(list_sorted, collapse=','))
result <- expand.grid(to_function)
print(result)
}
不幸的是,由于输出仅给出expend.grid
内的字符,因此我还没有实现将向量传递给expend.grid
函数的作用。
我发现了一个类似的question,包括mget
函数。我尝试按以下方法应用它,
mget(paste0("mydata", 1:3,"_sorted$Col1"))
但是我有这个:
Error: value for ‘mydata1_sorted$Col1’ not found
请问有什么解决方法吗?
答案 0 :(得分:2)
我们首先可以创建一个z
对象,其中包含datalist
每一组的所有行。然后我们将expand.grid
应用于每个矩阵。请记住,$Col1
必须在get()
函数之外。
z=lapply(datalist,function(x){lapply(x,function(y) get(paste0(y,"_sorted"))$Col1)})
lapply(z,expand.grid)
$`group1`
Var1 Var2 Var3
1 2.209588 2.600266 3.693475
2 3.251563 2.600266 3.693475
3 1.412309 2.600266 3.693475
4 2.209588 1.865730 3.693475
5 3.251563 1.865730 3.693475
6 1.412309 1.865730 3.693475
7 2.209588 2.600266 3.718085
8 3.251563 2.600266 3.718085
9 1.412309 2.600266 3.718085
10 2.209588 1.865730 3.718085
11 3.251563 1.865730 3.718085
12 1.412309 1.865730 3.718085
$group2
Var1 Var2
1 2.600266 3.693475
2 1.865730 3.693475
3 2.600266 3.718085
4 1.865730 3.718085
$group3
Var1 Var2
1 2.209588 3.693475
2 3.251563 3.693475
3 1.412309 3.693475
4 2.209588 3.718085
5 3.251563 3.718085
6 1.412309 3.718085
答案 1 :(得分:1)
这是tidyverse
library(tidyverse)
map(datalist, ~ mget(str_c(.x, "_sorted"), envir = .GlobalEnv) %>%
map(pluck, 'Col1')) %>%
map(expand.grid)