我有一个由4列组成的 Dataframe ,第一列中的值在整个 Dataframe 中出现2次。第二列是日期,第三和第四列是布尔值。我想完成的是合并重复项,并根据日期合并第三和第四列中的值。请参阅下面的示例以澄清问题;
keys <- c("A","A","B","B","C","C")
dates <- as.POSIXct(c("2021-01-01", "2021-02-02","2021-03-03", "2021-04-04", "2021-05-05", "2021-06-06"))
vals1 <- c("T","F","T","F","F","F")
vals2 <- c("F","T","T","T","F","T")
df <- data.frame(key = keys,
date = dates,
val1 = vals1,
val2 = vals2)
这将生成以下 Dataframe
> df
key date val1 val2
1 A 2021-01-01 T F
2 A 2021-02-02 F T
3 B 2021-03-03 T T
4 B 2021-04-04 F T
5 C 2021-05-05 F F
6 C 2021-06-06 F T
现在我想创建一个3行的 Dataframe ;1表示每个key值,其中val 1是日期最早的val 1值,val 2是日期最大的val 2值。
for (i in 1:nrow(df)){
val1 <- df %>%
filter(key == df$key[i]) %>%
slice(which.min(date)) %>%
ungroup() %>%
select(val1)
val2 <- df %>%
filter(key == df$key[i]) %>%
slice(which.max(date)) %>%
ungroup() %>%
select(val2)
df$val1[df$key == df$key[i]] <- val1$val1
df$val2[df$key == df$key[i]] <- val2$val2
}
df <- df[!duplicated(df$key),c("key","val1","val2")]
> df
key val1 val2
1 A T T
3 B T T
5 C F T
注意,在最终结果中,我对日期不感兴趣,只对val 1和val 2值感兴趣。日期只是用来确定结果中应该取哪个val 1或val 2值。这段代码对这个 Dataframe 工作得很好,但我想把它应用到一个大的 Dataframe (大约40 k行)上。
这是一个问题,因为我认为这是一个非常低效的方法来做到这一点,应用于这样一个大的 Dataframe 永远需要计算,我的 Dataframe 只会变得更大的未来。我怀疑这是由于循环,但我还没有想到其他方法来解决这个问题,因此我的问题:)希望有人能帮助我,所有的帮助是非常感谢。
此致
2条答案
按热度按时间irlmq6kh1#
laximzn52#
下面是一个替代方法: