【问题标题】:Using apply() to loop over each row of a dataframe with an if statement使用 apply() 通过 if 语句循环遍历数据帧的每一行
【发布时间】:2017-06-16 01:34:57
【问题描述】:

我是 R 的新手(和一般的编码),所以如果这是一个愚蠢的问题,我很抱歉,我怀疑这是一个简单的解决方法,我只是不明白如何正确地制作一个函数,但我们会看到。

我想向数据框中添加一个新列,其中包含一个字符串,该字符串取决于现有列中包含的值。例如,对于 iris 数据,如果一行在 Petal.Width 列中包含“0.2”的值,我想在新列中粘贴一个类似“Response String 1”的字符串。如果 Petal.Width 中的值 = 0.4,则在同一列中粘贴“响应字符串 2”。

我试图在 herehere 的帮助下解决这个问题,但未能成功。

到目前为止,我有这样的事情:

MyFunction <- function(petalWidth){
    if (petalWidth == 0.2){
    iris$NewColumn <- paste("Response String 1")
    }
}

apply(iris, 1, MyFunction(iris$Petal.Width))

出现此错误:

Error in get(as.character(FUN), mode = "function", envir = envir) : 
object 'Response String 1' of mode 'function' was not found
In addition: Warning message:
In if (petalWidth == 0.2) { :
the condition has length > 1 and only the first element will be used

我尝试了其他一些方法,包括查看for 声明。我不太确定如何构建这个函数才能正常工作。任何想法都将不胜感激,我希望我已经提供了足够的信息以使其可重现。谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    R 中有很多方法可以根据条件创建新列。不需要循环或申请这种东西,你应该使用 R 的“矢量化”操作,它可以一次作用于所有行:

    iris$NewColumn = ifelse(iris$Petal.Width == 0.2, "Response String 1", "Other")
    

    矢量化操作通常更快,并且通常会更好,因为当您尝试逐个元素添加到列时可能会导致意想不到的问题。

    【讨论】:

    • 谢谢你,效果很好。有没有办法说,如果宽度== 0.2,粘贴“RS1”,如果宽度== 0.3,粘贴“RS2”,如果宽度==0.5,粘贴“RS3”?我无法使其与ifdf$NewColumn = if (df$Petal.Width == 0.2){paste("string 1")} 一起使用,而不管花瓣宽度如何,都只是在每一列中粘贴“字符串 1”。
    • 太好了。非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 2017-07-24
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    相关资源
    最近更新 更多