可能有一个很简单的解释来说明我做错了什么,但我今天已经在这上面工作了相当长时间,但还是无法让它正常工作。我以为这会像在公园里散步一样简单,然而我的代码并没有像预期的那样正常工作。
所以举个例子,假设我有一个数据框如下。
df
Row# user columnB
1 1 NA
2 1 NA
3 1 NA
4 1 31
5 2 NA
6 2 NA
7 2 15
8 3 18
9 3 16
10 3 NA
基本上,我想创建一个新的列,使用 TTR 库包中的第一个(以及最后一个)函数,获取每个用户的第一个非 NA 值。因此,我的期望数据框应该是这样的。
df
Row# user columnB firstValue
1 1 NA 31
2 1 NA 31
3 1 NA 31
4 1 31 31
5 2 NA 15
6 2 NA 15
7 2 15 15
8 3 18 18
9 3 16 18
10 3 NA 18
我主要使用谷歌搜索了一下,但是没有找到确切的答案。
这是我尝试过的一些代码,但是我没有得到我想要的结果(请注意,我是从记忆中带来的,所以还有很多其他变化形式,但这些是我一直在尝试的基本形式)。
df$firstValue<-ave(df$columnB,df$user,FUN=first,na.rm=True)
df$firstValue<-ave(df$columnB,df$user,FUN=function(x){x,first,na.rm=True})
df$firstValue<-ave(df$columnB,df$user,FUN=function(x){first(x,na.rm=True)})
df$firstValue<-by(df,df$user,FUN=function(x){x,first,na.rm=True})
失败了,这些只给出每个组的第一个值,这将是NA。
再次说明,这些只是我脑海中的一些示例,我玩过na.rm,使用na.exclude,na.omit,na.action(na.omit)等...
任何帮助都将不胜感激。谢谢。
na.rm=True
替换为na.rm=TRUE
。 - jubaddply(df, .(user), transform, firstValue=ifelse(is.na(columnB),NA,na.omit(columnB)[1]))
? - Ben Bolkerfirst
/last
没有内置的na.rm
参数,因此您必须使用类似于na.omit()
的东西。 - Ben Bolker