gpt4 book ai didi

r - 删除重复的行,选择要保留的特定值

转载 作者:行者123 更新时间:2023-12-04 10:57:42 24 4
gpt4 key购买 nike

我正在处理一个看起来像这样的原始数据集:

df <- data.frame("ID" = c("Alpha", "Alpha", "Alpha", "Alpha", 
"Beta","Beta", "Beta","Beta" ),
"Year" = c(1970, 1970, 1980, 1990, 1970, 1980,
1980,1990),
"Val" = c(1,0,1,1,0,0,0,1),
"Val2" = c(0,0,0,1,0,1,0,1),
"Val3" = c(0,2.34,1.3,0,0,2.34,3.2,1.3))

数据有点脏,因为我对每个 ID 和年份标识符都有多个观察结果 - 例如我在 1970 年有 2 个不同的 Alpha 行。1980 年的 Beta 也是如此。

问题是感兴趣的变量 Val Val2 Val3在重复的行中有不同的分数(就 id/year 而言)。

我想找到一种简洁的方法来生成以下最终数据帧:
final<- data.frame("ID" = c("Alpha", "Alpha", "Alpha", 
"Beta", "Beta","Beta" ),
"Year" = c( 1970, 1980, 1990, 1970,
1980,1990),
"Val" = c(1,1,1,0,0,1),
"Val2" = c(0,0,1,0,1,1),
"Val3" = c(2.34,1,0,0,3.2,1.3))

final

逻辑如下:

1)我希望每个 ID/年只有一个 obs

2)对于每个感兴趣的变量( Val Val2 Val3 ),我只想在单个 ID/year 输出中保留具有较高值的​​观察

为了显示。在 df Alpha/1970 有重复的观察结果。我想将其减少到一行。 Val取0和1的值,在 final中仅保留数据框 1。 Val2取 0 和 0 的值,所以我只是在 final 中保留 0 . Val2取值为 2.34 和 1,因此我想保留在 final 中数据框。

我想我当时可以使用这个 data.table 命令完成这一列
library(dplyr)
val1<- df %>% select(ID:Val)
library(data.table)
setDT(val1)[order(-Val)][,.SD[1,], by = .(ID, Year)]
val2<- df %>% select(ID,Year,Val2)
library(data.table)
setDT(val2)[order(-Val2)][,.SD[1,], by = .(ID, Year)]


然后将这些值合并在一起,但有几列我必须运行该操作,我正在寻找一种更简洁的方法来做到这一点。

我希望它足够清楚

非常感谢您的帮助

最佳答案

这是一种选择

library(dplyr)
df %>%
group_by(ID, Year) %>%
summarise_all(max)
# for specific set of columns, use `summarise_at`
# summarise_at(vars(starts_with("Val")), max)

或与 data.table
library(data.table)
nm1 <- grep('^Val\\d*$", names(df))
setDT(df)[, (nm1) := lapply(.SD, max), .(ID, Year), .SDcols = nm1]

关于r - 删除重复的行,选择要保留的特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59076276/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com