假设我有一个数据框df
,有三个向量:
colours individual value
1 white individual 1 0.4
2 white individual 1 0.7
3 black individual 2 1.1
4 black individual 3 0.5
有时,同一个人会出现多次相同颜色但价值不同的人。我想编写一些代码来删除发生这种情况的所有实例。
***编辑:行数超过4百万 - 我不认为当前的解决方案有效。
我想计算我在for循环中出现的字符串的次数,然后从data.frame中删除它们。所以在上面的例子中,我想摆脱个别1.然后df将离开另外两行。
到目前为止,我的方法是:
获取所有颜色的列表
获取所有个人的列表
写两个for循环。
colours <- unique(df$colours)
ind <- unique(df$individual)
for (i in ind)
{
for (c in colour)
{
#something here. Probably if, asking if the person I'm on in the loop
#is found with the colour I am on, more than once, get rid of them
}
}
我的预期输出是:
colours individual value
black individual 2 1.1
black individual 3 0.5
来源数据
df <- data.frame(colours = c("white", "white", "black", "black"),
individual = c("individual 1", "individual 1", "individual 2", "individual 3"),
value = c(0.4, 0.7, 1.1, 0.5))
答案 0 :(得分:4)
您可以尝试使用anti_join()
库中的dplyr
:
library(dplyr)
anti_join(df1, df1[duplicated(df1[1:2]),], by="individual")
# colours individual value
#1 black individual 3 0.5
#2 black individual 2 1.1
答案 1 :(得分:1)
以下是使用data.table
library(data.table)
setDT(df1)[, if(.N==1) .SD , .(colours, individual)]
# colours individual value
#1: black individual 2 1.1
#2: black individual 3 0.5
答案 2 :(得分:0)
这应该做。我创建了一个样本数据集,添加了索引向量以显示您只保存了颜色用户出现的第一个出现。这是你的rownames是实际的行号。
## Data preparation
colours <- sample(c("red","blue","green","yellow"), size = 50, replace = T)
users <- sample(1:10, size=50, replace=T )
df <- data.frame(colours,users)
df$value <- runif(50)
df$index <- 1:50
## Keep only the first occurence
res <- unique(df[,1:2])
res$values <- df$value[as.integer(rownames(res))]
答案 3 :(得分:0)
一种简单的dplyr方法是根据需要进行分组,并对少于2次观察的群体进行过滤:
library(dplyr)
df %>%
group_by(colours, individual) %>%
filter(n() < 2)
Source: local data frame [2 x 3]
Groups: colours, individual [2]
colours individual value
(fctr) (fctr) (dbl)
1 black individual 2 1.1
2 black individual 3 0.5
答案 4 :(得分:0)
根据评论中的一些建议,这个答案效果最好:
df[!(duplicated(df[,1:2]) | duplicated(df[,1:2], fromLast = TRUE)), ]
与评论略有不同。这指定了列而不是行,因此从问题中获得了我想要的结果(删除那些个别和颜色重复的行)。通常更有用,因为问题中的示例数据只有四行而不是数百万。