首页 > 解决方案 > 如何在一个数据框中提取特定条目并将它们放入另一个空白数据框中?

问题描述

我有两个数据框(出于这个问题的目的,我创建了一些虚拟的。真实的要大得多)。第一个有我需要的所有数据:

df1 <- data.frame("id" = c(1, 1, 1, 1, 2, 2, 3, 3, 3, 3),
                  "Label" = c("Bonds", "Cash", "Stock", "Equity", "Cash", "Bonds", 
                              "Bonds", "Cash", "Equity", "Stock"),
                  "Value" = c(.25, .25, .30, .20, .60, .40, .10, .40, .20, .30))

第二个是空白数据框。

df2 <- data.frame(matrix(ncol = 3, nrow = 4))

我的目标:df2 中的每一列都应该与一个“id”相关联,每一行应该代表一个“标签”。df2 的条目应该是各自的“值”。在此示例中,代码运行后 df2 应如下所示:

           1       2      3
Bonds     .25     .40    .10
Cash      .25     .60    .40
Stock     .30     NA     .30
Equity    .20     NA     .20

这是我到目前为止所拥有的。我创建了一个具有唯一“id”的向量:

id <- unique(df1$id)

然后我创建了一个看起来很难看的嵌套 for 循环,它似乎不起作用:

for (i in length(id)){
     for (j in 4){
          if (df1$id[j] == id[i] & df1$Label[j] == "Bonds"){
               df2[1, i] <- df1[j, 3]
          }
          else if (df1$id[j] == id[i] & df1$Label[j] == "Cash"){
               df2[2, i] <- df1[j, 3]
          }
          else if (df1$id[j] == id[i] & df1$Label[j] == "Stock"){
               df2[2, i] <- df1[j, 3]
          }
          else if (df1$id[j] == id[i] & df1$Label[j] == "Equity"){
               df2[2, i] <- df1[j, 3]
          }
     }
}

运行此代码不会改变任何内容。我没有收到任何错误。我这样做是最糟糕的方式吗?为什么丑陋的嵌套 for 循环不做任何事情?

标签: r

解决方案


spread从包中使用tidyr可能更容易。

spread(df1, id, Value)

   Label    1   2   3
1  Bonds 0.25 0.4 0.1
2   Cash 0.25 0.6 0.4
3 Equity 0.20  NA 0.2
4  Stock 0.30  NA 0.3

这是您固定的丑陋循环和一些评论。

  1. 您的 for 函数只有一个值(长度(id)和 4)。如果要循环,则需要多个值(例如 1:length(id) 或 1:4)。您的循环只是查看了 df1 (1 - Equity - 0.2) 的第 4 行,并将其与 id 3 进行了比较。如果 id1 == id3 的条件不匹配。因此,您的循环什么也没做。
  2. 由于您的第二个 else if,您覆盖了同一列 (df2[2, i])。
  3. 您的 for-function 需要遍历整个 df1。你的 j 停得太早了。
id <- unique(df1$id)

df2 <- data.frame(matrix(ncol = 3, nrow = 4))
colnames(df2) <- id
rownames(df2) <- c("Bonds", "Cash", "Stock", "Equity")

for (i in 1:length(id)){
  for (j in 1:nrow(df1)){
    if (df1$id[j] == id[i] & df1$Label[j] == "Bonds"){
      df2[1, i] <- df1[j, 3]
    }
    else if (df1$id[j] == id[i] & df1$Label[j] == "Cash"){
      df2[2, i] <- df1[j, 3]
    }
    else if (df1$id[j] == id[i] & df1$Label[j] == "Stock"){
      df2[3, i] <- df1[j, 3]
    }
    else if (df1$id[j] == id[i] & df1$Label[j] == "Equity"){
      df2[4, i] <- df1[j, 3]
    }
  }
}


推荐阅读