我有一个有趣的给大家。
我希望首先:浏览ID列并识别重复的值。一旦识别出这些值,代码应遍历重复值的收入,并保留收入较大的行。
因此,如果有三个ID值2,它将寻找收入最高的一个,并保留该行。
ID Income
1 98765
2 3456
2 67
2 5498
5 23
6 98
7 5645
7 67871
9 983754
10 982
10 2374
10 875
10 4744
11 6853
我知道它像根据条件进行子集一样容易,但是我不知道如何根据一个单元格中的收入是否大于另一个单元格来删除行(仅当id匹配时才这样做)>
我当时正在考虑使用ifelse语句创建一个新列以标识重复项(是否通过子集),然后使用新列的值再次ifelse来标识较大的收入。从那里我可以根据我创建的新列进行子集设置。
是否有更快,更有效的方法?
结果应如下所示。
ID Income
1 98765
2 5498
5 23
6 98
7 67871
9 983754
10 4744
11 6853
谢谢
答案 0 :(得分:3)
我们可以通过检查按“ ID”分组的“收入”中的最高值来slice
行
library(dplyr)
df1 %>%
group_by(ID) %>%
slice(which.max(Income))
或使用data.table
library(data.table)
setDT(df1)[, .SD[which.max(Income)], by = ID]
或与base R
df1[with(df1, ave(Income, ID, FUN = max) == Income),]
# ID Income
#1 1 98765
#4 2 5498
#5 5 23
#6 6 98
#8 7 67871
#9 9 983754
#13 10 4744
#14 11 6853
df1 <- structure(list(ID = c(1L, 2L, 2L, 2L, 5L, 6L, 7L, 7L, 9L, 10L,
10L, 10L, 10L, 11L), Income = c(98765L, 3456L, 67L, 5498L, 23L,
98L, 5645L, 67871L, 983754L, 982L, 2374L, 875L, 4744L, 6853L)),
class = "data.frame", row.names = c(NA,
-14L))
答案 1 :(得分:3)
order
与duplicated
(基本R)
df=df[order(df$ID,-df$Income),]
df[!duplicated(df$ID),]
ID Income
1 1 98765
4 2 5498
5 5 23
6 6 98
8 7 67871
9 9 983754
13 10 4744
14 11 6853
答案 2 :(得分:3)
这是另一种dplyr
方法。我们可以排列列,然后在第一行中切片数据框。
library(dplyr)
df2 <- df %>%
arrange(ID, desc(Income)) %>%
group_by(ID) %>%
slice(1) %>%
ungroup()
df2
# # A tibble: 8 x 2
# ID Income
# <int> <int>
# 1 1 98765
# 2 2 5498
# 3 5 23
# 4 6 98
# 5 7 67871
# 6 9 983754
# 7 10 4744
# 8 11 6853
数据
df <- read.table(text = "ID Income
1 98765
2 3456
2 67
2 5498
5 23
6 98
7 5645
7 67871
9 983754
10 982
10 2374
10 875
10 4744
11 6853",
header = TRUE)
答案 3 :(得分:2)
Group_by和dplyr的总结也可以
df1 %>%
group_by(ID) %>%
summarise(Income=max(Income))
ID Income
<int> <dbl>
1 1 98765.
2 2 5498.
3 5 23.
4 6 98.
5 7 67871.
6 9 983754.
7 10 4744.
8 11 6853.
答案 4 :(得分:2)
使用sqldf
:按ID
分组,然后选择相应的max Income
library(sqldf)
sqldf("select ID,max(Income) from df group by ID")
输出:
ID max(Income)
1 1 98765
2 2 5498
3 5 23
4 6 98
5 7 67871
6 9 983754
7 10 4744
8 11 6853