如何在此数据框列的 R 中正确使用 apply?

Posted

技术标签:

【中文标题】如何在此数据框列的 R 中正确使用 apply?【英文标题】:How can I use apply properly in R in this dataframe column? 【发布时间】:2019-04-03 16:11:40 【问题描述】:

我有一个带有 NA 的数据框列,我想如何对列使用 apply(或 lapply、sapply、...)。

我尝试过 apply 和 lapply,但它返回错误。

我要应用于该列的功能是:

a.b <- function(x, y = 165)
  if (x < y)
    return('Good')
  else if (x > y)
    return('Bad')

数据框的列是: 数据$col = 180 170 NA NA 185 185

当我使用 apply 时,我得到:

apply(data$col, 2, a.b)
 Error in apply(data$col, 2, a.b) : 
   dim(X) must have a positive length

我尝试过 dim(data$col) 并且返回为 NULL,我认为这是因为 NA 的原因。

我也使用 lapply,我得到:

lapply(data$col, a.b)
Error in if (x < y) return("Good") else if (x > y) return("Bad") : 
  missing value where TRUE/FALSE needed

这是针对初学者的R课程,如果我犯了一些错误,我很抱歉。感谢您花时间阅读并尝试提供帮助。

【问题讨论】:

【参考方案1】:

apply 用于矩阵,而不是vector。试试:

a.b <- function(x, y = 165)
  if (is.na(x))
    return("NA")
   else if (x < y)
    return('Good') else if (x > y)
    return('Bad')

data$col=sapply(data$col,a.b)

【讨论】:

【参考方案2】:

您应该能够使用mapply 通过指定要传递给参数的值来解决此问题:

mapply(a.b, x = data[,'col'], y = 165)

请注意,您可能需要修改 a.b.() 函数才能管理 NA's

【讨论】:

【参考方案3】:

这里有几个问题:

apply 的意思是在一个有维度的东西上运行,这是MARGIN 参数。您传递给apply 的列没有维度。见下文:
> dim(mtcars)
[1] 32 11
> dim(mtcars$cyl)
NULL

applylapply 旨在遍历所有列(或行,如果您使用 apply 的边距)。如果只想替换一列,则不应使用apply。如果您想将my_col 替换为将其传递给my_func 的结果,请执行data$my_col &lt;- my_func(data$my_col) 之类的操作

NA 值在使用运算符时不会返回 TRUEFALSE。请注意,7 &lt; NA 将返回 NA。您的 if 语句正在寻找 TRUEFALSE 值,但获得了 NA 值,因此您的第二次尝试出现错误。如果您想处理 NA 值,您可能需要使用 is.na 将其合并到您的函数中。

您的函数应该是矢量化的。请参阅R-Inferno 的第 3 圈。目前,它只会返回长度为 1 的 "Good""Bad" 向量。我的预感是您想要的类似于以下内容(尽管x == y 不完全相同)

a.b <- function(x, y = 165)
  ifelse(x < y, "Good", "Bad")

我相信使用上述信息应该可以让你到达你想去的地方。

【讨论】:

以上是关于如何在此数据框列的 R 中正确使用 apply?的主要内容,如果未能解决你的问题,请参考以下文章

特定数据框列上的 R Apply() 函数

如何在r中减去两个数据框列的平均值“平均值(df1 $ a-df2 $ b)”

R数据存储在一个数据框列的两个列表中,想要创建单独的列

如何在循环中读取数据框列值并检查每列的数据类型

R:分配数据框列的变量标签

如何将 lambda 函数正确应用到 pandas 数据框列