在数据框中排除具有相同值的相同变量的行

时间:2016-07-21 07:59:04

标签: r dataframe

我想在这个数据框架中排除游戏A和B之间没有差异的玩家。

Player  Points  Game
Sam 13  A
Sam 14  A
Sam 15  A
Sam 12  B
Sam 11  B
Sam 10  B
Max 12  A
Max 15  A
Max 13  A
Max 18  B
Max 17  B
Max 16  B
Tom 15  A
Tom 15  A
Tom 15  A
Tom 15  B
Tom 15  B
Tom 15  B
Joe 16  A
Joe 19  A
Joe 15  A
Joe 15  B
Joe 17  B
Joe 12  B

我知道我可以简单地排除“Tom”,但是我如何在没有通过每个玩家的数百名玩家的大数据框架中进行此操作?

3 个答案:

答案 0 :(得分:2)

使用database.yml,一个想法是找到方差,如果所有值都相同则为0,

dplyr

答案 1 :(得分:1)

我们可以使用uniqueN中的data.table。将'data.frame'转换为'data.table'(setDT(df1),按'Player'分组,如果'Points'的唯一数量的长度大于1,则获取Data.Table的子集。

library(data.table)
setDT(df1)[, if(uniqueN(Points)>1) .SD, by  = Player]

OP也有可能想要在“游戏”之间进行比较。在这种情况下,我们将“游戏”为“A”和“B”的“点”进行子集,得到差异,检查它们是否都为0,如果不是,则获取Data.table的子集。

setDT(df1)[, if(!all(!(Points[Game=="A"] - Points[Game=="B"]))) .SD, Player]

或使用dplyr

library(dplyr)
df1 %>%
   group_by(Player) %>%
   filter(n_distinct(Points) >1)

或者基本R选项是

i1 <- rowSums(table(df1[-3])!=0)==1
subset(df1, !Player %in% names(i1)[i1])

答案 2 :(得分:0)

以下是在基础R中使用xtabs的另一种解决方案:

tb <- xtabs(Points~Game+Player,df)

    # Player
# Game Joe Max Sam Tom
   # A  50  40  42  45
   # B  44  51  33  45

df[df$Player %in% colnames(tb[,diff(tb)!=0]),]

我们的想法是使用xtabs为每个GamePlayer生成一个交叉表,然后筛选出那些游戏中{。点}}点之间差异的玩家并且A不为零(即B