有条件地按其他列值填充列

问题描述 投票:2回答:2

我有大约400万行个人数据,如下所示:

names <- c("Peter", "Peter", "Peter", "Peter", "Peter", "Peter", "Peter", "Lisa", "Bert", "Carine", "Carine", "Carine", "Carine", "Carine", "Carine")
luckyToday <- c(0,0,0,NA,0,0,1,NA,1,NA,0,0,0,1,1)
luckyYesterday <- NA_real_
df1 <- data.frame(names,luckyToday,luckyYesterday)

df1
# names luckyToday luckyYesterday
# 1   Peter          0             NA
# 2   Peter          0             NA
# 3   Peter          0             NA
# 4   Peter         NA             NA
# 5   Peter          0             NA
# 6   Peter          0             NA
# 7   Peter          1             NA
# 8    Lisa         NA             NA
# 9    Bert          1             NA
# 10 Carine         NA             NA
# 11 Carine          0             NA
# 12 Carine          0             NA
# 13 Carine          0             NA
# 14 Carine          1             NA
# 15 Carine          1             NA

数据包含对人的观察(一些观察1次,一些观察更多)和幸运感(1 =幸运,0 =不幸,NA =无信息)。作为一个滞后变量,我想引入一个新变量(“luckyY yesterday”),它告诉我这个人在上次观察期间是否幸运。所以我希望数据看起来像这样:

df2
# names luckyToday luckyYesterday
# 1   Peter          0             NA
# 2   Peter          0              0
# 3   Peter          0              0
# 4   Peter         NA              0
# 5   Peter          0              0
# 6   Peter          0              0
# 7   Peter          1              0
# 8    Lisa         NA             NA
# 9    Bert          1             NA
# 10 Carine         NA             NA
# 11 Carine          0              0
# 12 Carine          0              0
# 13 Carine          0              0
# 14 Carine          1              0
# 15 Carine          1              1

我知道R不是应用这种数据争论的完美程序,但它是必要的。

我想考虑以下事项:

  1. 考虑一下这些是我观察过的独特人物,不要混淆不同人的观察。
  2. 较低的观察结果较新。对一个独特的人的最后一次观察是最新的(第7行是彼得的最新观察)。
  3. 如果“luckyToday”列中有一个NA(例如第4行),我也不希望相应的“luckyY yesterdayNA”(第5行)也填充NA。我更希望相应的单元格填充“luckyToday”列中最新的“非NA”观察值,在示例数据中为“0”。如果先前的观察结果只是NA,那么我认为它们等于最新的观察结果。 (如果我有9个NA并且第10个观察值是“1”,那么我想假设观察值1-9也是“1”。
  4. 如果每个人只有一个观察,我想在“幸运的昨天”专栏中找到NA,因为我不知道以前的运气状态。

我自己尝试了2个for循环,但是我的数据耗时超过400万次。任何人都可以使用更快的解决方案帮助我,例如data.table或apply函数吗?我非常感激!

干杯

r data.table conditional
2个回答
2
投票

您可以使用shift中的data.table函数来观察昨天和na.locf函数中的zoo函数,以便在昨天或明天填写NA,具体取决于fromLast参数是F还是T,如果您不想混合观察,也可以按名称分组不同的人:

library(data.table); library(zoo)
setDT(df1)[,luckyYesterday := shift(na.locf(luckyToday, fromLast = TRUE)), names]

df1
#      names luckyToday luckyYesterday
#  1:  Peter          0             NA
#  2:  Peter          0              0
#  3:  Peter          0              0
#  4:  Peter         NA              0
#  5:  Peter          0              0
#  6:  Peter          0              0
#  7:  Peter          1              0
#  8:   Lisa         NA             NA
#  9:   Bert          1             NA
# 10: Carine         NA             NA
# 11: Carine          0              0
# 12: Carine          0              0
# 13: Carine          0              0
# 14: Carine          1              0
# 15: Carine          1              1

2
投票
names <- c("Peter", "Peter", "Peter", "Peter", "Peter", "Peter", 
    "Peter", "Lisa", "Bert", "Carine", "Carine", "Carine", "Carine", "Carine", "Carine")
luckyToday <- c(0,0,0,NA,0,0,1,NA,1,NA,0,0,0,1,1)
luckyYesterday <- NA
df1 <- data.frame(names,luckyToday,luckyYesterday)

# New code
library(data.table) 
data.table(df1)[,list(luckyToday, c(NA, luckyToday[1:(.N-1)])),by=list(names)]
© www.soinside.com 2019 - 2024. All rights reserved.