1

我正在尝试使用循环来打印与大型数据框中行(样本)的某些特定值相对应的列(变量)。例如

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

有什么建议吗?

4

3 回答 3

1

假设您有一个行索引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-19T01:57:40.623 回答
1
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    7
于 2013-06-19T02:14:15.400 回答
1

假设我们有一个列表,其中每个元素是您要为每一行匹配的值:

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-19T04:21:30.317 回答