我有一个基本的问题,我希望不要重复。我环顾四周,但找不到能直接解决问题的人。 我有一个看起来像这样的数据集:
df <- data.frame("Reporter" = c("USA", "USA", "USA", "USA",
"EU","EU", "EU","EU" ),
"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))
问题是我有一些重复的国家年度观察,这给我的分析带来了麻烦。 (美国1970年为val1,欧盟1980年为val2)。
我想删除重复的行,这些行始终保持最高的不匹配分数(1)。由于存在数百行的问题,因此我想知道是否存在一种自动方法来找出重复的数据并删除值较小的数据
我找到了一种方法来区分重复的行
df1<- df%>% select(Reporter, Year)
df1$duplicat <- duplicated(df1) %>% filter(duplicat=="TRUE")
但是我仍然不确定如何根据指定的标准将其删除。通常我会使用anti_join,但是它不起作用,因为df1数据匹配两行。
在此先感谢您的帮助
答案 0 :(得分:3)
您可以使用data.table:
const sayHello = () => ( console.log('Hello') )
答案 1 :(得分:2)
一个dplyr
选项将以arrange
和Val
Val2
的数据帧,并为每个Reporter
和Year
选择最后一行
library(dplyr)
df %>%
arrange(Val, Val2) %>%
group_by(Reporter, Year) %>%
slice(n())
# Reporter Year Val Val2
# <fct> <dbl> <dbl> <dbl>
#1 EU 1970 0 0
#2 EU 1980 0 1
#3 EU 1990 1 1
#4 USA 1970 1 0
#5 USA 1980 1 0
#6 USA 1990 1 1
答案 2 :(得分:1)
一种方法是按df
和Val
排序Val2
,然后删除Reporter
和Year
列都匹配的重复项:
df <- df[order(df[,'Val'],df[,'Val2'], decreasing=TRUE),]
df <- df[!duplicated(df[c("Reporter","Year")]),]
Reporter Year Val Val2
4 USA 1990 1 1
8 EU 1990 1 1
1 USA 1970 1 0
3 USA 1980 1 0
6 EU 1980 0 1
5 EU 1970 0 0
答案 3 :(得分:1)
我使用data.table::setorder()
试了一下您的问题。您可以使用管道并将其放入一行。得出与heds1相同的结果,但是如果您有大量数据集,则值得将两者与基准进行比较。
代码:
dt1 <- data.table("Reporter" = c("USA", "USA", "USA", "USA",
"EU","EU", "EU","EU" ),
"Year" = c(1970, 1970, 1980, 1990, 1970, 1980,
1980,1990),
"Val1" = c(1,0,1,1,0,0,0,1),
"Val2" = c(0,0,0,1,0,1,0,1))
dt2 <- setorder(dt1, -`Val1`, -`Val2`)
dt3 <- unique(dt2, by = c("Reporter", "Year"))
输出:
Reporter Year Val1 Val2
1: USA 1990 1 1
2: EU 1990 1 1
3: USA 1970 1 0
4: USA 1980 1 0
5: EU 1980 0 1
6: EU 1970 0 0