【问题标题】:R, Code works without for loop, but not inside loopR,代码在没有 for 循环的情况下工作,但不在循环内
【发布时间】:2018-11-09 15:33:41
【问题描述】:

我想用在另一个数据帧(结果,40 行)中找到的值替换某个数据帧(driftm,4 列,6904​​2 行)的一列(分数)的条目。

我的想法是这样的:

driftm$Fraction[i] <-
as.vector((results$Fraction[match((driftm$variable[i]), (results$WorkingCode))]))

我检查的变量 (drift$variable) 是一个因素,因此我将其转换为向量。当手动将 i 设置为driftm$value 长度内的任何值时,代码会工作并相应地替换。但在 for 循环中它什么也不做。

for (i in length(driftm$values)){
driftm$Fraction[i] <-
as.vector((results$Fraction[match((driftm$variable[i]), (results$WorkingCode))]))
}

This is the dataframe driftm This is the dataframe results

所以基本上我想替换,现在写为“替换”的内容为所述分数的正确字符串,取自 results$Fraction。

有什么更优雅的方法可以做到这一点?

【问题讨论】:

  • 需要更多 as.character 可能...
  • 是的,不是很优雅 xD 改了,还是不行
  • 所以,据我所知,您的主 df driftm 中有 40 行,您想用结果中的内容替换它们吗?您可以在driftm 中创建您想要替换并使用它而不是此解决方案的行的索引吗?如果您向我们提供数据样本(您要替换的几行、不想替换的几行以及结果中的几行),将会很有帮助。
  • 使用 for 循环并不是一种优雅的方式。但抛开这一点不谈,我们需要一些样本数据,以便我们可以验证错误并进行故障排除。
  • 否,结果中有 40 行。结果在 match() 函数中使用,我想在其中找到与driftm$Fraction 相同的条目。 driftm$fraction 中有 69042 行,但其中的值仅在结果中找到的值的空间中。

标签: r loops for-loop rstudio


【解决方案1】:

找到我的问题

尽管仍然对更优雅的解决方案感兴趣,但我的简单错误是 for 循环的定义。

for (i in **1:**length(driftm$variable){
driftm$Fraction[i] <-
as.vector((results$Fraction[match((driftm$variable[i]), (results$WorkingCode))]))
}

【讨论】:

    【解决方案2】:

    稍微优雅一点的解决方案:

    数据:

    driftm<-data.frame(Fraction=1:10, Variable=c(letters[1:5],letters[5:1]))
    results<-data.frame(Fraction=10:11, WorkingCode=c(letters[2:3]))
    

    使用dplyr

    library(dplyr)
    driftm$Fraction<-left_join(driftm,results,by=c("Variable"="WorkingCode")) %>% 
      with(coalesce(Fraction.y,Fraction.x))
    

    结果:

       Fraction Variable
    1         1        a
    2        10        b
    3        11        c
    4         4        d
    5         5        e
    6         6        e
    7         7        d
    8        11        c
    9        10        b
    10       10        a
    

    【讨论】:

    • 非常感谢。 dplyr 中的 join 函数看起来是一种很棒的方法。不那么直截了当,但也许更快?
    • 应该明显更快。我使用coalesce修改了代码,使其更加简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多