我有以下数据集:
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
答案 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
在前三个参数(MARGIN
,FUN
,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)
请注意,此函数可能无法执行您想要的操作 - 它会检查您提供的向量 - 示例中的整行 - 是否仅包含整数,如果是,则返回最大值。由于向量只能有一个类型,如果你有任何非整数,== 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'?
,它没有做任何事情。