使用 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
在前三个参数之后,(X
、MARGIN
、FUN
),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
,但没有任何作用。
我有以下数据集:
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 usecheckd
but not when I usemax
inapply
在前三个参数之后,(X
、MARGIN
、FUN
),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
,但没有任何作用。