R 按条件删除面板数据中的重复行

R 按条件删除面板数据中的重复行,r,duplicates,R,Duplicates,我有一个基本的问题,我希望这不是一个复制品。我环顾了一下四周,但找不到直接回答这个问题的人。 我的数据集如下所示: df <- data.frame("Reporter" = c("USA", "USA", "USA", "USA", "EU","EU", "EU","EU" ), "Year" = c(1970, 1970, 1980, 1990, 1970, 1980, 1980,1990), "Val

我有一个基本的问题,我希望这不是一个复制品。我环顾了一下四周,但找不到直接回答这个问题的人。 我的数据集如下所示:

   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))

df一种方法是通过
Val
Val2
df
进行排序,然后在
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

df一种方法是通过
Val
Val2
df
进行排序,然后在
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

df使用
data.table::setorder()
我给了你一个解决问题的机会。你可以用一根管子把它放到一条管线上。给出了与heds1相同的结果,但如果您有一个大型数据集,则值得将两者与基准进行比较

代码:


dt1使用
data.table::setorder()
我给了你一个解决问题的机会。你可以用一根管子把它放到一条管线上。给出了与heds1相同的结果,但如果您有一个大型数据集,则值得将两者与基准进行比较

代码:


dt1A
dplyr
选项是按
Val
Val2
排列数据帧,并为每个
Reporter
年份选择最后一行

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
库(dplyr)
df%>%
排列(Val,Val2)%>%
分组人(报告人,年份)%>%
切片(n())
#记者年份Val Val2
#        
#1欧盟1970 0 0
#2欧盟1980 0 1
#3欧盟1990 1
#4美国1970 1 0
#5美国1980 1 0
#6美国1990 1

一个
dplyr
选项是按
Val
Val2
排列数据帧,并为每个
Reporter
年份选择最后一行

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
库(dplyr)
df%>%
排列(Val,Val2)%>%
分组人(报告人,年份)%>%
切片(n())
#记者年份Val Val2
#        
#1欧盟1970 0 0
#2欧盟1980 0 1
#3欧盟1990 1
#4美国1970 1 0
#5美国1980 1 0
#6美国1990 1

您可以使用数据表:

setDT(df)[order(-Val)][,.SD[1,], by = .(Reporter, Year)] 

您可以使用data.table:

setDT(df)[order(-Val)][,.SD[1,], by = .(Reporter, Year)] 

谢谢,我通常更喜欢使用dplyr,但它告诉我slice不适用于类数据表的对象。。。尽管如此,我还是用data.table解决了这个问题!塔克斯anyways@Alessandro我不知道您有
数据。表
,因为您共享的数据是dataframe。尽管如此,当我将
df
更改为
data.table
时,它仍然适用于我。你能试着重新启动你的会话并再次检查吗?嗯,这很奇怪:这是r告诉我的错误:
UseMethod(“slice”)中的错误:
没有适用于“slice”的方法应用于类“c”('grouped_-df'、'tbl_-df'、'tbl'、'data.frame')“
,知道它可能是什么吗?我明白了。我想可能有一些包冲突。您能否明确提到包名并尝试
df%>%dplyr::arrange(Val,Val2)%%>%dplyr::group_by(Reporter,Year)%%>%dplyr::slice(n())
?谢谢您,我通常更喜欢使用dplyr,但它告诉我slice不适用于类数据表的对象。。。尽管如此,我还是用data.table解决了这个问题!塔克斯anyways@Alessandro我不知道您有
数据。表
,因为您共享的数据是dataframe。尽管如此,当我将
df
更改为
data.table
时,它仍然适用于我。你能试着重新启动你的会话并再次检查吗?嗯,这很奇怪:这是r告诉我的错误:
UseMethod(“slice”)中的错误:
没有适用于“slice”的方法应用于类“c”('grouped_-df'、'tbl_-df'、'tbl'、'data.frame')“
,知道它可能是什么吗?我明白了。我想可能有一些包冲突。您能否明确提到包名并尝试
df%>%dplyr::arrange(Val,Val2)%%>%dplyr::group_by(Reporter,Year)%%>%dplyr::slice(n())