R语言 根据其他列中的重复值和日期合并2列中的值

f0ofjuux  于 2023-03-10  发布在  其他
关注(0)|答案(2)|浏览(130)

我有一个由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 只会变得更大的未来。我怀疑这是由于循环,但我还没有想到其他方法来解决这个问题,因此我的问题:)希望有人能帮助我,所有的帮助是非常感谢。
此致

irlmq6kh

irlmq6kh1#

df %>% 
  group_by(key) %>% 
  summarise(val1 = val1[which.min(date)], 
            val2 = val2[which.max(date)]) %>%
  ungroup()

  key   val1  val2 
1 A     T     T    
2 B     T     T    
3 C     F     T
laximzn5

laximzn52#

下面是一个替代方法:

library(dplyr) # dplyr 1.1.0
df %>%
  summarise(val1 = val1[date == min(date)],
            val2 = val2[date == max(date)], .by=key)

  key val1 val2
1   A    T    T
2   B    T    T
3   C    F    T

相关问题