关于我在做什么错,可能确实有一个简单的解释,但是今天我已经为此工作了一段时间,但我仍然无法使它起作用。我以为这是在公园里散步,但是我的代码并没有按预期工作。
因此,对于此示例,假设我有一个如下的数据框。
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
我主要使用Google环顾四周,但找不到真正的答案。
这是我尝试过的一些代码,但是没有得到想要的结果(请注意,我是从内存中获取的,所以这些还有很多变体,但是这些是常规形式我一直在尝试)。
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.exclude,na.omit,na.action(na.omit)等玩过na.rm ...
任何帮助将不胜感激。谢谢。
最佳答案
data.table
解决方案
require(data.table)
DT <- data.table(df, key="user")
DT[, firstValue := na.omit(columnB)[1], by=user]