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

时间:2016-01-13 21:30:34

标签: r max apply na

我有以下数据集:

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带来任何问题。为什么R在我使用na.rm= TRUE时拒绝checkd但在申请时使用max时拒绝?

谢谢,

的Dom

1 个答案:

答案 0 :(得分: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 
  

为什么R在我使用na.rm= TRUE时拒绝checkd但在max

中使用apply时拒绝X

在前三个参数(MARGINFUNapply)之后,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)

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

我还删除了您的Error use of undeclared identifier 'chdir'; did you mean '_chdir'? Error use of undeclared identifier 'fdopen' Error use of undeclared identifier 'read' Error use of undeclared identifier 'write' Error use of undeclared identifier 'close' Error use of undeclared identifier 'O_RDONLY' Error use of undeclared identifier 'O_APPEND' Error use of undeclared identifier 'dup'; did you mean '_dup'? Error use of undeclared identifier 'creat'; did you mean '_creat'? ,它没有做任何事情。