【问题标题】:Add column in which a value j of a row i is inserted添加插入第 i 行的值 j 的列
【发布时间】:2013-06-19 01:12:23
【问题描述】:

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

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

有什么建议吗?

【问题讨论】:

  • “for r1=2 for r2=12, for r3=7”是什么意思?
  • 对不起,如果我不清楚。这只是一个示例,第 1 行的值为 2,第 2 行的值为 12(示例中不存在),第 3 行的值为 7。谢谢

标签: r loops


【解决方案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

【讨论】:

  • 谢谢!这对我来说可能是最好的解决方案,因为可以以非常简单的方式在特定行中选择多个值。 ferdinand.kraft 的解决方案对我来说似乎也很优雅。
【解决方案2】:

假设您有一个行索引向量 rows &lt;- c(1,2,3) 和一个对应值向量 val &lt;- 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)]])

【讨论】:

    【解决方案3】:
    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多