关于我在做什么错,可能确实有一个简单的解释,但是今天我已经为此工作了一段时间,但我仍然无法使它起作用。我以为这是在公园里散步,但是我的代码并没有按预期工作。

因此,对于此示例,假设我有一个如下的数据框。

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]

07-24 09:52
查看更多