当我通过一个数据帧的行使用应用一个函数,我失去该行的元素的类信息。 他们都变成“角色”。 下面是一个简单的例子。 我想几年增加了3岁的走狗。 当我尝试添加2已被数字为r的值表示“非数字的参数,以二元运算符。” 如何避免这种情况?
age = c(20, 30, 50)
who = c("Larry", "Curly", "Mo")
df = data.frame(who, age)
colnames(df) <- c( '_who_', '_age_')
dfunc <- function (er) {
print(er['_age_'])
print(er[2])
print(is.numeric(er[2]))
print(class(er[2]))
return (er[2] + 2)
}
a <- apply(df,1, dfunc)
输出如下:
_age_
"20"
_age_
"20"
[1] FALSE
[1] "character"
Error in er[2] + 2 : non-numeric argument to binary operator
apply
只有真正适用于矩阵(这对所有元素是同一类型)。 当您在运行data.frame
,它只是调用as.matrix
第一。
解决这个问题的最简单方法是只在数字列工作:
# skips the first column
a <- apply(df[, -1, drop=FALSE],1, dfunc)
# Or in two steps:
m <- as.matrix(df[, -1, drop=FALSE])
a <- apply(m,1, dfunc)
所述drop=FALSE
需要,避免受到单个列向量。 -1
表示所有,但是,第一列,你可以而是明确指定需要的列,例如df[, c('foo', 'bar')]
UPDATE
如果你希望你的功能,在同一时间访问一个充满data.frame行,有(至少)两个选项:
# "loop" over the index and extract a row at a time
sapply(seq_len(nrow(df)), function(i) dfunc(df[i,]))
# Use split to produce a list where each element is a row
sapply(split(df, seq_len(nrow(df))), dfunc)
第一种选择可能是对大数据帧的更好,因为它不具备创造了巨大的列表结构的前期。