【问题标题】:Using apply to find max in a data frame with missing values and strings使用 apply 在缺少值和字符串的数据框中查找最大值
【发布时间】:2016-01-13 21:30:33
【问题描述】:

我有以下数据集:

df<-data.frame(read.table(header = TRUE, text = "
     ID N1 N2 N3 N4
      1 2 3 4 5
     11 NA -12 14 55
     21 12 SON 34 14"))

我想知道每行中的最大条目是多少。例如,第一行中有 5 个。显然,由于缺少值('NA')和字符串('SON'),情况会更加复杂。

我首先尝试了以下命令:

df$Result<-apply(df,1, max, na.rm= TRUE)

结果是 [5,55, SON]!不是我想要的。因此,我尝试了:

checkd<- function(x) if(is.integer(x)== TRUE)max(x)
df$Result<-apply(df,1, checkd)

有趣的是,它删除了最后一列 df$Result。有谁知道我做错了什么?另外,我的问题有什么解决方案?

另外,我尝试以下代码:

checkd<- function(x) if(is.integer(x)== TRUE)max(x)
df$Result<-apply(df,1, checkd, na.rm= TRUE)

它给了我Error in FUN(newX[, i], ...) : unused argument (na.rm = TRUE)!这是为什么?我的函数checkd 通常似乎不会对 R 造成任何问题。为什么当我使用 checkd 时 R 拒绝 na.rm= TRUE 而在应用中使用 max 时却拒绝?

谢谢,

Dom

【问题讨论】:

  • 试试apply(as.matrix(data.frame(lapply(df,as.numeric))),1,max,na.rm=TRUE)

标签: r max apply na


【解决方案1】:

使用数据框的要点之一是列中的所有内容都必须具有相同的类。如果您想将数据视为数字,则在每一列上运行as.numeric(),字符串,如"SON",将转换为NA

数据框也专注于按列操作。如果您想按行排列,matrix 可能更有意义:

mat = sapply(df, function(x) as.numeric(as.character(x)))
# as.numeric(as.character()) is necessary when starting with a factor
mat
#      ID N1  N2 N3 N4
# [1,]  1  2   3  4  5
# [2,] 11 NA -12 14 55
# [3,] 21 12  NA 34 14

apply(mat, 1, max, na.rm = T)
# [1]  5 55 34 

为什么当我使用checkd 时R 拒绝na.rm= TRUE 而当我在apply 中使用max 时却不拒绝

在前三个参数(XMARGINFUN)之后,apply 只是将参数传递给您传递给 FUN 的函数。如果您查看?max 的帮助,您会看到它被定义为采用名为na.rm 的参数。您对checkd 的定义没有这样的论点。如果你想为你的函数添加一个na.rm 参数,你可以这样做:

checkd <- function(x, na.rm = TRUE) if(is.integer(x)) max(x, na.rm = na.rm)
# or even this
checkd <- function(x, ...) if(is.integer(x)) max(x, ...)

请注意,此函数可能不会执行您想要的操作 - 它会检查您提供的向量(示例中的一整行)是否仅包含整数,如果是,它将返回最大值。由于向量只能有一种类型,如果其中有任何非整数,is.integer(x) 将为 false,并且不会计算最大值。

我还删除了你的== TRUE,它没有任何作用。

【讨论】:

  • 谢谢!这真的很有用!只是一个快速的后续问题。我玩过as.numeric!我碰巧注意到它把第三列3 -12 SON变成了下面的数值2 1 3!我的问题是为什么它不将3 转换为3,而是转换为2-12,而不是转换为-12,而是转换为1 等。如果我想这样做,该怎么做?无论如何,非常感谢您的解释。超级好用!
  • 你可能有一个因素要开始。见编辑。和see here 了解更多详情。
猜你喜欢
  • 2018-02-07
  • 2016-11-02
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 2019-10-20
相关资源
最近更新 更多