【问题标题】:"for" loop not working“for”循环不起作用
【发布时间】:2017-04-13 21:25:27
【问题描述】:

我正在尝试从数据框中隔离一些值 示例:

test_df0<- data.frame('col1'= c('string1', 'string2', 'string1'),
'col2' = c('value1', 'value2', 'value3'),
'col3' = c('string3', 'string4', 'string3'))

我想获得一个新的数据框,其中只有来自 col1 的唯一字符串,以及来自 col3 的相关字符串(对于具有相同 col1 的行,这将是相同的。 这是我写的循环,但我一定犯了一些直截了当的错误:

test_df1<- as.data.frame(matrix(ncol= 2, nrow=0))
colnames(test_df1)<- c('col1', 'col3')
for (i in unique(test_df0$col1)){
  first_matching_row<- match(x = i, table = test_df0$col1)
  temp_df<-
    data.frame('col1'= i,
               'col3'= test_df0[first_matching_row, 'col3'])
  rbind(test_df1, temp_df)}

生成的 test_df1 虽然是空的。无法发现循环的错误,如果有任何建议,我将不胜感激。

编辑:for 循环正在工作,如果它的最后一行是 print(temp_df) 而不是 rbind 命令,我会得到正确的结果。我不确定为什么 rbind 不工作

【问题讨论】:

  • test_df0[!duplicated(test_df0[["col1"]]), c("col1", "col3")] 是否符合您的要求?如果是这样,我可以把它写成答案并解释它在做什么。
  • 像魅力一样工作!你介意解释一下为什么循环不起作用吗?谢谢
  • @Istrel 这行不通,因为col2 的值不一样。你必须这样做test_df1 &lt;- unique(test_df0[c("col1", "col3")])

标签: r for-loop dataframe


【解决方案1】:

使用duplicated() 函数是一种更简单、更快捷的方法。 duplicated() 查看并输入向量并返回 TRUE 如果该值已在向量中的较早索引处看到。例如:

> duplicated(c(0,0,0,1,2,3,0,3))
[1] FALSE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE

因为0 的第一个值之前没有见过,但接下来的两个却出现了。对于12 和第一个3,它之前没有看到这些数字,但它之前看到了最后两个数字03。这意味着!duplicated() 将为数据的唯一值返回TRUE

我们可以使用它来索引数据框以获取 test_df0 的唯一值为 col1 的行,如下所示:

test_df0[!duplicated(test_df0[["col1"]]), ]

但这会返回数据框的所有列。如果我们只想要col1col3,我们也可以使用以下方法对列进行索引:

test_df0[!duplicated(test_df0[["col1"]]), c("col1", "col3")]

至于为什么循环不起作用,正如@Jacob 提到的那样,您没有将使用rbind 创建的值分配给一个值,因此您创建的值在函数调用后消失了。

【讨论】:

    【解决方案2】:

    您实际上并没有将 rbind 分配给任何东西!大概你需要这样的东西:

    test_df1 <- rbind(test_df1, temp_df)
    

    【讨论】:

    • 谢谢,这真是一个愚蠢的错误。我反复阅读剧本并没有发现它。现在,这是一个难题!巴克给了我一个优雅的方式来完成这项工作,你解释了错误是什么。不知道你们中的哪一个应该得到最好的答案!非常感谢
    猜你喜欢
    • 1970-01-01
    • 2013-12-31
    • 2018-04-22
    • 2016-05-13
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多