我有一个看似简单的问题,但真的让我发疯。我真的需要你的帮助。
首先让我们生成一些data.frame
a<-c(rep(1:2,2),NA,NA)
b<-c(rep(NA,3),3,4,NA)
df<-cbind(a,b)
这将给出一个表格:
a b
[1,] 1 NA
[2,] 2 NA
[3,] 1 NA
[4,] 2 3
[5,] NA 4
[6,] NA NA
现在我需要第三列:
当a和b都不是NA时,返回两者中的最大值。
当其中一个不是NA时,返回非NA号
当它们都是NA时,返回NA。
总结一下,我正在寻找这样的结果:
a b c
[1,] 1 NA 1
[2,] 2 NA 2
[3,] 1 NA 1
[4,] 2 3 3
[5,] NA 4 4
[6,] NA NA NA
我试过df$c<-max(df$a,df$b)
,显然这不起作用并给我:
Error in df$a : $ operator is invalid for atomic vectors
答案 0 :(得分:1)
将数据集('df'为'矩阵')转换为'data.frame'后,您可以尝试pmax
cbind(df, c=do.call(`pmax`, c(as.data.frame(df), list(na.rm=TRUE))))
# a b c
#[1,] 1 NA 1
#[2,] 2 NA 2
#[3,] 1 NA 1
#[4,] 2 3 3
#[5,] NA 4 4
#[6,] NA NA NA
如果您需要每行的“min”值,请将pmax
替换为pmin
。
要创建“data.frame”,您可以使用
df <- data.frame(a, b)
cbind
将输出视为'矩阵'。 $
运算符不支持'矩阵',因此最好使用[
答案 1 :(得分:1)
你也可以使用&#34;常规&#34; max
功能:
df <- cbind(df, c = apply(df, 1, function(x) ifelse(all(is.na(x)), NA, max(x, na.rm=T))))
df
# a b c
#[1,] 1 NA 1
#[2,] 2 NA 2
#[3,] 1 NA 1
#[4,] 2 3 3
#[5,] NA 4 4
#[6,] NA NA NA