【问题标题】:Nested for loop fails to loop嵌套for循环无法循环
【发布时间】:2018-07-13 18:53:36
【问题描述】:

我编写了以下嵌套 for 循环,它应该遍历数据框 df,如果行 q 中有 a,则在 a 列中创建 1。通常,对于 a、b 和 c 列,如果 q 列中的条目与列名匹配,则 a、b 和 c 列应通过具有一个来表示。

由于我无法很好地描述它,这里有一段代码来说明我的意思。

此时,生成的 df 仅在 c 列中的相应第三行中具有 1,但在 a 或 b 列中没有。

    df = data.frame(q=c("a","b","c"),a=c(0,0,0),b=c(0,0,0),c=c(0,0,0))

    for (x in nrow(df)) {
  for (y in ncol(df)) { 
if (colnames(df[y]) == df$q[x]) { 
  df[x,y] = 1} 
}}

A picture of the intended output (whereas the red "1s" do not appear at this moment:

此外,我正在处理的实际数据框大约是 100 000 行和 100 列。

谢谢!

【问题讨论】:

    标签: r for-loop dataframe nested nested-loops


    【解决方案1】:

    因为 for (x in nrow(df)) 表示 x = 3,导致 nrow(df) 返回 3。你应该这样写: for (x in 1 : nrow(df)),返回 1 2 3。

    for (x in 1 : nrow(df)) {
      for (y in 1 : ncol(df)) { 
        if (colnames(df[y]) == df$q[x]) { 
          df[x,y] = 1} 
      }
    }
    

    现在 df 就是你想要的。

    【讨论】:

      【解决方案2】:

      这是避免循环的另一种选择。

      library(tidyr)       
      library(dplyr)
      gather(df, key, value, -q) %>%
       mutate(value = if_else(q == key, 1, 0)) %>%
       spread(key, value)
       #  q a b c
       #1 a 1 0 0
       #2 b 0 1 0
       #3 c 0 0 1
      

      gatherabc,然后将新创建的列keyq 进行比较。如果各自的值相同,则分配1,否则分配0

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-11
        • 1970-01-01
        • 1970-01-01
        • 2015-01-28
        • 1970-01-01
        • 2014-06-10
        相关资源
        最近更新 更多