失去类的信息,当我使用申请中的R(Losing Class information when I u

2019-07-28 20:06发布

当我通过一个数据帧的行使用应用一个函数,我失去该行的元素的类信息。 他们都变成“角色”。 下面是一个简单的例子。 我想几年增加了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

Answer 1:

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)

第一种选择可能是对大数据帧的更好,因为它不具备创造了巨大的列表结构的前期。



文章来源: Losing Class information when I use apply in R
标签: r class apply