如何在此数据框列的 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
apply
和 lapply
旨在遍历所有列(或行,如果您使用 apply
的边距)。如果只想替换一列,则不应使用apply
。如果您想将my_col
替换为将其传递给my_func
的结果,请执行data$my_col <- my_func(data$my_col)
之类的操作
NA
值在使用运算符时不会返回 TRUE
或 FALSE
。请注意,7 < NA
将返回 NA
。您的 if
语句正在寻找 TRUE
或 FALSE
值,但获得了 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?的主要内容,如果未能解决你的问题,请参考以下文章