繁体   English   中英

嵌套的for循环失败

[英]Nested for loop fails to loop

我编写了以下嵌套的for循环,该循环应该在数据帧df上进行迭代,并且如果第q行包含a,则在a列中创建1。 通常,对于a,b和c列,如果q列中的条目与列名匹配,则a,b和c列应以1表示。

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

此时,所得的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} 
}}

预期输出的图片(而此时红色“ 1”没有出现:

而且,我正在处理的实际数据框大约为10万行和100列。

谢谢!

因为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是您想要的。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM