比较R中同一列中的两个变量
comparing two variables in the same column in R
我有两列。一个有变量列表,例如"cat", "dog", "rat", "chicken" 还有一个是宠物店是第一次还是第二次去过。
visit_number pet
1 dog
2 dog
1 cat
2 cat
1 rat
2 chicken
我希望比较 R
中两次访问之间的差异,例如intersect()
和 setdiff()
。基本和这个问题一模一样:
Compare two lists in R
但是,我没有两个列表,而是在一个列中有两个变量,我似乎无法让代码工作。
我想要实现的是这样一个函数,但它使用单列而不是两个列表(代码取自另一个问题):
xtab_set <- function(A,B){
both <- union(A,B)
inA <- both %in% A
inB <- both %in% B
return(table(inA,inB))
}
如果我正确理解了您的问题,这里有一个使用 dplyr
包中的函数的解决方案:
full_join(filter(df, visit_number == 1), filter(df, visit_number == 2), by = 'pet') %>%
mutate(visit1 = !is.na(visit_number.x),
visit2 = !is.na(visit_number.y),
both = visit1 & visit2) %>%
select(-starts_with('visit_number'))
给予:
pet visit1 visit2 both
1 dog TRUE TRUE TRUE
2 cat TRUE TRUE TRUE
3 rat TRUE FALSE FALSE
4 chicken FALSE TRUE FALSE
说实话,输出矩阵不是很清楚。但是,您在评论中提到您正在“寻找每次访问中仅在访问第一次、仅在访问第二次和两次访问中都发生的独特个体动物的数量(计数)。”在您提供的文件中也有 3 次访问。我正在考虑三次访问。
以下代码将显示访问的独特个体动物的数量以及在所有访问中出现的独特个体动物的数量。
步骤 1。构建原始数据集
library(data.table)
df = data.table(visit_number = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 3),
pet = c("Dog", "Rat", "Cat", "Dog", "Chicken", "Cat", "Dog", "Cat", "Fish", "Horse"))
步骤 2。创建一个可理解的列名称向量以供将来参考
cols = c(paste0(rep("Visit", length(unique(df$visit_number))), unique(df$visit_number)))
步骤 3。创建宠物外观矩阵
df = dcast.data.table(df, pet ~ visit_number, value.var = "pet", fun.aggregate = length)
names(df)[-1] = cols # assign understandable column names
步骤 4。定义所有访问中出现的宠物
df[, AllVisits := Reduce(`*`, .SD), .SDcols = cols]
它给出:
df
pet Visit1 Visit2 Visit3 AllVisits
1: Cat 1 1 1 1
2: Chicken 0 1 0 0
3: Dog 1 1 1 1
4: Fish 0 0 1 0
5: Horse 0 0 1 0
6: Rat 1 0 0 0
老鼠在访问 1 中是独一无二的,鸡在访问 2 中是独一无二的,鱼和马在访问 3 中是独一无二的。猫和狗出现在所有访问中。
步骤 5。获取访问动物的唯一数量和所有访问中出现的动物的唯一数量
idx = df[, Reduce(`+`, .SD) == 1, .SDcols = cols]
unlist(c(df[idx, lapply(.SD, function(x) sum(x)), .SDcols = cols], AllVisits = df[, sum(AllVisits)]))
结果是:
Visit1 Visit2 Visit3 AllVisits
1 1 2 2
如果这就是您要找的,请告诉我。
P.S。如果宠物在访问期间可能出现多次,则需要修改代码。
我有两列。一个有变量列表,例如"cat", "dog", "rat", "chicken" 还有一个是宠物店是第一次还是第二次去过。
visit_number pet
1 dog
2 dog
1 cat
2 cat
1 rat
2 chicken
我希望比较 R
中两次访问之间的差异,例如intersect()
和 setdiff()
。基本和这个问题一模一样:
Compare two lists in R
但是,我没有两个列表,而是在一个列中有两个变量,我似乎无法让代码工作。
我想要实现的是这样一个函数,但它使用单列而不是两个列表(代码取自另一个问题):
xtab_set <- function(A,B){
both <- union(A,B)
inA <- both %in% A
inB <- both %in% B
return(table(inA,inB))
}
如果我正确理解了您的问题,这里有一个使用 dplyr
包中的函数的解决方案:
full_join(filter(df, visit_number == 1), filter(df, visit_number == 2), by = 'pet') %>%
mutate(visit1 = !is.na(visit_number.x),
visit2 = !is.na(visit_number.y),
both = visit1 & visit2) %>%
select(-starts_with('visit_number'))
给予:
pet visit1 visit2 both
1 dog TRUE TRUE TRUE
2 cat TRUE TRUE TRUE
3 rat TRUE FALSE FALSE
4 chicken FALSE TRUE FALSE
说实话,输出矩阵不是很清楚。但是,您在评论中提到您正在“寻找每次访问中仅在访问第一次、仅在访问第二次和两次访问中都发生的独特个体动物的数量(计数)。”在您提供的文件中也有 3 次访问。我正在考虑三次访问。
以下代码将显示访问的独特个体动物的数量以及在所有访问中出现的独特个体动物的数量。
步骤 1。构建原始数据集
library(data.table)
df = data.table(visit_number = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 3),
pet = c("Dog", "Rat", "Cat", "Dog", "Chicken", "Cat", "Dog", "Cat", "Fish", "Horse"))
步骤 2。创建一个可理解的列名称向量以供将来参考
cols = c(paste0(rep("Visit", length(unique(df$visit_number))), unique(df$visit_number)))
步骤 3。创建宠物外观矩阵
df = dcast.data.table(df, pet ~ visit_number, value.var = "pet", fun.aggregate = length)
names(df)[-1] = cols # assign understandable column names
步骤 4。定义所有访问中出现的宠物
df[, AllVisits := Reduce(`*`, .SD), .SDcols = cols]
它给出:
df
pet Visit1 Visit2 Visit3 AllVisits
1: Cat 1 1 1 1
2: Chicken 0 1 0 0
3: Dog 1 1 1 1
4: Fish 0 0 1 0
5: Horse 0 0 1 0
6: Rat 1 0 0 0
老鼠在访问 1 中是独一无二的,鸡在访问 2 中是独一无二的,鱼和马在访问 3 中是独一无二的。猫和狗出现在所有访问中。
步骤 5。获取访问动物的唯一数量和所有访问中出现的动物的唯一数量
idx = df[, Reduce(`+`, .SD) == 1, .SDcols = cols]
unlist(c(df[idx, lapply(.SD, function(x) sum(x)), .SDcols = cols], AllVisits = df[, sum(AllVisits)]))
结果是:
Visit1 Visit2 Visit3 AllVisits
1 1 2 2
如果这就是您要找的,请告诉我。
P.S。如果宠物在访问期间可能出现多次,则需要修改代码。