我正在尝试使用一个循环来打印与大数据框中某一行(样本)的特定值相对应的列(变量)。例如
c1<-c(1,2,3) c2<-c(4,5,6) c3<-c(7,8,9) data<-as.data.frame(rbind(c1,c2,c3))
row V1 V2 V3
r1 1 2 3
r2 4 5 6
r3 7 8 9如果为ri=j (其中j是一个值列表),那么我想将行i的值j插入其中的列添加到数据帧中。例如,如果列表的目标值为
对于r1=2
对于r2=12
对于r3=7
那么结果将是
row V1 V2 V3 V4 V5
r1 1 2 3 2 1
r2 4 5 6 5 4
r3 7 8 9 8 7有什么建议吗?
发布于 2013-06-19 12:21:30
假设我们有一个列表,其中每个元素都是您希望为每行匹配的值:
r.values <- list(r1=c(2), r2=c(12), r3=c(7))和你之前的数据帧一样:
data <- data.frame(c(1,2,3), c(4,5,6), c(7,8,9))现在,我们希望根据每一行与r.values中的值匹配的位置来构建感兴趣的列索引的向量
indices <- c()
for (i in 1:nrow(data)) {
indices <- c(indices, which(data[i,] %in% r.values[[i]]))
}
data[,indices]这将为您提供以下内容:
V2 V1
c1 2 1
c2 5 4
c3 8 7可喜的是,它可以扩展为跨行查看多个值,或者完全忽略行:
r.values <- list(c(2,3), NA, r3=c(7,8))再次运行上面的循环会得到以下结果:
V2 V3 V1 V2.1
c1 2 3 1 2
c2 5 6 4 5
c3 8 9 7 8发布于 2013-06-19 09:57:41
假设您有一个行索引向量rows <- c(1,2,3)和一个相应值向量val <- c(2, 12, 7)。
我们开始创建一个向量来获取所有应该添加的列:
newcols <- c()
for(i in seq_along(rows))
{
temp <- which(data[rows[i],]==val[i])
if(length(temp)==0) temp <- NA
newcols[i] <- temp
}现在我们只需添加您的列:
result <- cbind(data, data[, newcols[!is.na(newcols)]])发布于 2013-06-19 10:14:15
i <- c(1, 2, 3)
j <- c(2, 12, 7)
col.idx <- mapply(match, j, split(data, rownames(data))[i])
# [1] 2 NA 1
data.frame(data, data[i, na.omit(col.idx)])
# V1 V2 V3 V2.1 V1.1
# c1 1 2 3 2 1
# c2 4 5 6 5 4
# c3 7 8 9 8 7https://stackoverflow.com/questions/17181438
复制相似问题