根据 R 中列中值的外观对数据集进行子集化
Subset a dataset based on the appearance of values in a column in R
我有一个包含两列的数据集 (ds)。 “匹配”中有一个或两个具有相同编号的条目。 “状态”是一个二进制变量。有成对的,例如match中的值12出现了两次,一次是status为1的,一次是0。然而,在比赛中也有观察到没有伴侣的人,在这个数据集中,没有伴侣的人是 3,8,33,17。
match status
12 1
3 1
5 0
8 1
33 0
5 1
12 0
17 0
我想做的是创建一个新的数据集,它只包含对的观察(因此如果一个值出现两次)。在我的示例中,它将是
match status
12 1
12 0
5 0
5 1
最终数据集中的状态变量将为 50/50,因为匹配中的值(例如 12)有一个状态 = 0 和一个状态 = 1 的观察值。
我使用的实际数据集有超过 50k 个观察值,所以我不能只按每个数字搜索和过滤。我试过的是:
numbers <- table(ds$match)
numbers <- as.data.frame(numbers)
numbers <- numbers[numbers$Freq == 2,]
numbers <- numbers$Var1
ds$keep <- ifelse(numbers %in% ds$match, 1, 0)
这里我得到错误“替换有 23005 行,数据有 39021”如果我能解决这个错误我想我可以 运行
ds <- filter(ds, ds$keep == 1)
获取我想要的数据集。这是我最有希望的方法。我尝试了一些其他的事情,但它总是因为状态变量不是 50/50 的事实而完成,所以我无法在没有一对的情况下排除所有观察结果。有人知道如何修复我的代码,或者是否有 quicker/more 顺利的解决方案?提前感谢您的帮助!
library(dplyr)
ds %>% group_by(match) %>% filter(n()>1) %>% arrange(match,status)
match status
<dbl> <dbl>
1 5 0
2 5 1
3 12 0
4 12 1
你也可以这样做:
ds <- ds[order(ds$match),]
id = rle(ds$match)
ds[ds$match %in% id$values[id$lengths>1],]
match status
<dbl> <dbl>
1 5 0
2 5 1
3 12 1
4 12 0
我有一个包含两列的数据集 (ds)。 “匹配”中有一个或两个具有相同编号的条目。 “状态”是一个二进制变量。有成对的,例如match中的值12出现了两次,一次是status为1的,一次是0。然而,在比赛中也有观察到没有伴侣的人,在这个数据集中,没有伴侣的人是 3,8,33,17。
match status
12 1
3 1
5 0
8 1
33 0
5 1
12 0
17 0
我想做的是创建一个新的数据集,它只包含对的观察(因此如果一个值出现两次)。在我的示例中,它将是
match status
12 1
12 0
5 0
5 1
最终数据集中的状态变量将为 50/50,因为匹配中的值(例如 12)有一个状态 = 0 和一个状态 = 1 的观察值。 我使用的实际数据集有超过 50k 个观察值,所以我不能只按每个数字搜索和过滤。我试过的是:
numbers <- table(ds$match)
numbers <- as.data.frame(numbers)
numbers <- numbers[numbers$Freq == 2,]
numbers <- numbers$Var1
ds$keep <- ifelse(numbers %in% ds$match, 1, 0)
这里我得到错误“替换有 23005 行,数据有 39021”如果我能解决这个错误我想我可以 运行
ds <- filter(ds, ds$keep == 1)
获取我想要的数据集。这是我最有希望的方法。我尝试了一些其他的事情,但它总是因为状态变量不是 50/50 的事实而完成,所以我无法在没有一对的情况下排除所有观察结果。有人知道如何修复我的代码,或者是否有 quicker/more 顺利的解决方案?提前感谢您的帮助!
library(dplyr)
ds %>% group_by(match) %>% filter(n()>1) %>% arrange(match,status)
match status
<dbl> <dbl>
1 5 0
2 5 1
3 12 0
4 12 1
你也可以这样做:
ds <- ds[order(ds$match),]
id = rle(ds$match)
ds[ds$match %in% id$values[id$lengths>1],]
match status
<dbl> <dbl>
1 5 0
2 5 1
3 12 1
4 12 0