使用 apply 在具有缺失值和字符串的数据框中查找最大值

Using apply to find max in a data frame with missing values and strings

我有以下数据集:

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

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

数据框也专注于column-wise操作。如果你想去 row-wise,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 

Why does R reject na.rm= TRUE when I use checkd but not when I use max in apply

在前三个参数之后,(XMARGINFUN),apply 只是将参数传递给传递给 [=22 的函数=].如果您查看 ?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, ...)

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

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