R:使用 lapply 同时在两个列表上迭代一个函数?
R: iterate a function over two lists simultaneously using lapply?
我有多个因素划分我的数据。
根据一个因素 (uniqueGroup
),我想对我的数据进行子集化,根据另一个因素 (distance
),我想首先根据 "moving threshold" 对我的数据进行分类,然后然后检验组间的统计差异。
我创建了一个函数 movThreshold
来对我的数据进行分类,并通过 wilcox.test
对其进行了测试。为了改变不同的阈值,我只是 运行
lapply(th.list, # list of thresholds
movThreshold, # my function
tab = tab, # original data
dependent = "infGrad") # dependent variable
现在我意识到,事实上 我需要首先通过 uniqueGroup
对我的数据 进行子集化,然后 然后改变阈值 。但是我不确定,如何在我的 lapply
代码中编写它?
我的虚拟数据:
set.seed(10)
infGrad <- c(rnorm(20, mean=14, sd=8),
rnorm(20, mean=13, sd=5),
rnorm(20, mean=8, sd=2),
rnorm(20, mean=7, sd=1))
distance <- rep(c(1:4), each = 20)
uniqueGroup <- rep(c("x", "y"), 40)
tab<-data.frame(infGrad, distance, uniqueGroup)
# Create moving threshold function &
# test for original data
# ============================================
movThreshold <- function(th, tab, dependent, ...) {
# Classify data
tab$group<- ifelse(tab$distance < th, "a", "b")
# Calculate wincoxon test - as I have only two groups
test<-wilcox.test(tab[[dependent]] ~ as.factor(group), # specify column name
data = tab)
# Put results in a vector
c(th, unique(tab$uniqueGroup), dependent, uniqueGroup, round(test$p.value, 3))
}
# Define two vectors to run through
# unique group
gr.list<-unique(tab$uniqueGroup)
# unique threshold
th.list<-c(2,3,4)
如何 运行 lapply
超过两个列表?
lapply(c(th.list,gr.list), # iterate over two vectors, DOES not work!!
movThreshold,
tab = tab,
dependent = "infGrad")
在我之前的问题 () 中,我学会了如何遍历 table:
中的各个子集
lapply(split(tab, df$uniqueGroup), movThreshold})
但是如何遍历子集并一次遍历阈值?
如果我理解正确你想做什么,这里有一个 data.table
解决方案:
library(data.table)
setDT(tab)[, lapply(th.list, movThreshold, tab = tab, dependent = "infGrad"), by = uniqueGroup]
此外,您也可以嵌套 lapply
。
lapply(gr.list, function(z) lapply(th.list, movThreshold, tab = tab[uniqueGroup == z, ], dependent = "infGrad"))
如果我误解了你的意思,我深表歉意。
我有多个因素划分我的数据。
根据一个因素 (uniqueGroup
),我想对我的数据进行子集化,根据另一个因素 (distance
),我想首先根据 "moving threshold" 对我的数据进行分类,然后然后检验组间的统计差异。
我创建了一个函数 movThreshold
来对我的数据进行分类,并通过 wilcox.test
对其进行了测试。为了改变不同的阈值,我只是 运行
lapply(th.list, # list of thresholds
movThreshold, # my function
tab = tab, # original data
dependent = "infGrad") # dependent variable
现在我意识到,事实上 我需要首先通过 uniqueGroup
对我的数据 进行子集化,然后 然后改变阈值 。但是我不确定,如何在我的 lapply
代码中编写它?
我的虚拟数据:
set.seed(10)
infGrad <- c(rnorm(20, mean=14, sd=8),
rnorm(20, mean=13, sd=5),
rnorm(20, mean=8, sd=2),
rnorm(20, mean=7, sd=1))
distance <- rep(c(1:4), each = 20)
uniqueGroup <- rep(c("x", "y"), 40)
tab<-data.frame(infGrad, distance, uniqueGroup)
# Create moving threshold function &
# test for original data
# ============================================
movThreshold <- function(th, tab, dependent, ...) {
# Classify data
tab$group<- ifelse(tab$distance < th, "a", "b")
# Calculate wincoxon test - as I have only two groups
test<-wilcox.test(tab[[dependent]] ~ as.factor(group), # specify column name
data = tab)
# Put results in a vector
c(th, unique(tab$uniqueGroup), dependent, uniqueGroup, round(test$p.value, 3))
}
# Define two vectors to run through
# unique group
gr.list<-unique(tab$uniqueGroup)
# unique threshold
th.list<-c(2,3,4)
如何 运行 lapply
超过两个列表?
lapply(c(th.list,gr.list), # iterate over two vectors, DOES not work!!
movThreshold,
tab = tab,
dependent = "infGrad")
在我之前的问题 (
lapply(split(tab, df$uniqueGroup), movThreshold})
但是如何遍历子集并一次遍历阈值?
如果我理解正确你想做什么,这里有一个 data.table
解决方案:
library(data.table)
setDT(tab)[, lapply(th.list, movThreshold, tab = tab, dependent = "infGrad"), by = uniqueGroup]
此外,您也可以嵌套 lapply
。
lapply(gr.list, function(z) lapply(th.list, movThreshold, tab = tab[uniqueGroup == z, ], dependent = "infGrad"))
如果我误解了你的意思,我深表歉意。