gpt4 book ai didi

r - 按 R 中的中值折叠重复行

转载 作者:行者123 更新时间:2023-12-01 13:53:05 25 4
gpt4 key购买 nike

我有一个包含两列的日期框。我想删除第一列中有重复条目的行。但是我想根据第二列的值选择一个特定的行来保留。

特别是 - 如果第 1 列中有 2 个重复条目,我希望删除第 2 列中具有较低值的行

或者如果第 1 列中有超过 2 个相同的条目,那么我希望保留第 2 行中具有中值的行。

因此对于数据框

a <- c(rep("A", 3), rep("B", 3), rep("C",1), rep("D",1), rep("D",1))
b <- c(1,2,3,4,5,6,4,7,6)
df <-data.frame(a,b)

会变成

a <- c(rep("A", 1), rep("B", 1), rep("C",1), rep("D",1))
b <- c(2,5,4,7)
df <-data.frame(a,b)

我尝试了 unique() 和 duplicated() 函数,但似乎找不到满足这些条件的参数。非常感谢任何帮助。

最佳答案

你可以试试

library(data.table)
setDT(df)[, list(b=if(.N==2) min(b) else median(b)) , by = a]
# a b
#1: A 2
#2: B 5
#3: C 4
#4: D 6

或与 aggregate 类似的选项

aggregate(b~a, df, FUN=function(x) if(length(x)==2) min(x) else median(x))
# a b
#1 A 2
#2 B 5
#3 C 4
#4 D 6

或者

library(sqldf)
sqldf('select a,
case
when count(b) is 2 then min(b)
else median(b)
end b
from df
group by a')
# a b
#1 A 2
#2 B 5
#3 C 4
#4 D 6

根据显示的预期输出,最后一行是 D 7,因此如果我们在组长度为 2 时选择第一个观察值,

 setDT(df)[, list(b=if(.N==2) b[1L] else median(b)) , by = a]
# a b
#1: A 2
#2: B 5
#3: C 4
#4: D 7

或者

 aggregate(b~a, df, FUN=function(x) if(length(x)==2) x[1L] else median(x))
# a b
#1 A 2
#2 B 5
#3 C 4
#4 D 7

或者

 sqldf('select a,
case
when count(b) is 2 and min(rowid) then b
else median(b)
end b
from df
group by a')
# a b
#1 A 2
#2 B 5
#3 C 4
#4 D 7
在我看到@eipi10 的帖子后,

EDIT 将第一次观察更改为 min。没有正确阅读 OP 的帖子,并且 OP 的预期输出与描述不符。

关于r - 按 R 中的中值折叠重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31209715/

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