R 迭代列名的子集
我不熟悉R,但这里我有一个包含多个条件测量值的数据框架,我想在相同条件的列上执行嵌套循环,测试它们是否至少有两个真实测量值(不是零),如果是,则计算新数据集中这些特定条件的平均值R 迭代列名的子集,r,loops,for-loop,nested,dplyr,R,Loops,For Loop,Nested,Dplyr,我不熟悉R,但这里我有一个包含多个条件测量值的数据框架,我想在相同条件的列上执行嵌套循环,测试它们是否至少有两个真实测量值(不是零),如果是,则计算新数据集中这些特定条件的平均值 > sample <- list(c(8,0,12,5,0,11), c(15,5,0,10,12,13), c(1,1,0,3,0,9), c(11,9,8,0,4,7), c(12,5,5,0,9,0), c(1,7,2,0,8,0)) > sample <-
> sample <- list(c(8,0,12,5,0,11), c(15,5,0,10,12,13), c(1,1,0,3,0,9),
c(11,9,8,0,4,7), c(12,5,5,0,9,0), c(1,7,2,0,8,0))
> sample <- as.data.frame(sample)
> colnames(sample) <- c("x.1","x.2","x.3","y.1","y.2","y.3")
> sample
x.1 x.2 x.3 y.1 y.2 y.3
1 8 15 1 11 12 1
2 0 5 1 9 5 7
3 12 0 0 8 5 2
4 5 10 3 0 0 0
5 0 12 0 4 9 8
6 11 13 9 7 0 0
我们循环遍历
列表中“x”和“y”列的索引
,获得逻辑矩阵的行和
,并使用ifelse
获得行平均数
data.frame(setNames(lapply(list(grep("^x", names(sample)),
grep("^y", names(sample))), function(i) {
x1 <- sample[i]
ifelse(rowSums(x1!=0)>1, rowMeans(x1), 0)}), c("x", "y")))
# x y
#1 8 8
#2 2 7
#3 0 5
#4 6 0
#5 0 7
#6 11 0
data.frame(集合名(lappy)(列表)(grep(^x),名称(示例)),
grep(“^y”,名称(示例)),函数(i){
x11,row表示(x1,0)}),c(“x”,“y”))
#xy
#1 8 8
#2 2 7
#3 0 5
#4 6 0
#5 0 7
#6 11 0
我们定义了f_rowmean
函数:
f_rowmean <- function(y) apply(y,1, function(x) ifelse(sum(x!=0)>=2, mean(x), 0))
编辑
至于OP的新问题陈述(在注释中),假设您的数据集位于df1
,那么您可以执行以下操作:
res.cols <- c("CAOV-3 Reg", "CAOV-3 Mod", "OVCAR-3Reg", "OVCAR-4Reg", "VOA1056Reg",
"VOA4698Reg", "VOA4698Mod", "TOV112DReg", "TOV112DMod", "TOV21G Mod",
"HCC38 Reg", "HCC38 Mod")
res <- setNames(data.frame(matrix(0,nrow(df1),length(res.cols))), res.cols)
res <- sapply(res.cols, function(x) res[,x] <- f_rowmean(df1[,grep(x, names(df1))]))
res.cols抱歉,我没有澄清这一点,但我的数据集比上面这个虚拟示例大得多。它实际上是由38个测量13个条件的复制测量列组成的,所以我想做一个循环,遍历整个数据帧来创建一个新的数据帧,而不仅仅是x和ylist@Mohere很容易改变这一点抱歉,我没有澄清这一点,但我的数据集比上面这个虚拟示例大得多。它实际上由38个测量13个条件的复制测量列组成,因此我想在整个数据帧中创建一个循环来创建一个新的数据帧,而不仅仅是x和y列表。列名是:“CAOV-3 Reg.1”“CAOV-3 Reg.2”“CAOV-3 Reg.3”“CAOV-3 Mod.1”“CAOVV-3 Mod.2”“CAOVV-3 Mod.3”“OVCAR-3Reg.1”“OVCAR-3Reg.2”“OVCAR-3Reg.3”“OVCAR-4Reg.1”“OVCAR-4Reg.2”“VOA1056Reg.3”“VOA4698Reg.1”“VOA4698Reg.2”“VOA4698Reg.3”“VOA4698Mod.1”“VOA4698Mod.2”“VOA4698Mod.3”“至V112DMOD.1”“至V112DMOD.2”“至V112DMOD.3”“至V21G Reg Reg.2”“至V21G Reg Reg.3”“至21G Mod.21G.21G”“至21G.2”“VG.2”“VG.21”“VG.2”“VG.21”“VG.2”“VG.2”“VG.2”“VGHCC38 Reg.2“HCC38 Mod.1”HCC38 Mod.2“HCC38 Mod.3”,理想情况下,我想创建一个数据帧:>y2[1]“CAOV-3 Reg”“CAOV-3 Mod”“OVCAR-3Reg”“OVCAR-4Reg”“VOA1056Reg”“VOA4698Reg”“VOA4698Mod”[8]“TOV112DReg”“TOV112DMod”“TOV21G Mod”“HCC38 Reg”“HCC38 Mod”工作得非常好。谢谢!
data.frame(x=f_rowmean(sample[,grep("x", names(sample))]),
y=f_rowmean(sample[,grep("y", names(sample))]))
# x y
# 1 8 8
# 2 2 7
# 3 0 5
# 4 6 0
# 5 0 7
# 6 11 0
res.cols <- c("CAOV-3 Reg", "CAOV-3 Mod", "OVCAR-3Reg", "OVCAR-4Reg", "VOA1056Reg",
"VOA4698Reg", "VOA4698Mod", "TOV112DReg", "TOV112DMod", "TOV21G Mod",
"HCC38 Reg", "HCC38 Mod")
res <- setNames(data.frame(matrix(0,nrow(df1),length(res.cols))), res.cols)
res <- sapply(res.cols, function(x) res[,x] <- f_rowmean(df1[,grep(x, names(df1))]))