r - 比较R中同一列中的两个变量
问题描述
我有两列。一个有一个变量列表,例如“cat”、“dog”、“rat”、“chicken”,另一个是第一次还是第二次访问宠物店。
visit_number pet
1 dog
2 dog
1 cat
2 cat
1 rat
2 chicken
我希望比较R
例如intersect()
和中的两次访问之间的差异setdiff()
。基本上和这个问题完全一样:
但是,我没有两个列表,但在一个列中有两个变量,我似乎无法让代码工作。
我想要实现的是这样的功能,但它使用单列而不是两个列表(代码取自另一个问题):
xtab_set <- function(A,B){
both <- union(A,B)
inA <- both %in% A
inB <- both %in% B
return(table(inA,inB))
}
解决方案
坦率地说,输出矩阵不是很清楚。但是,您在评论中提到,您“正在寻找每次访问中仅在访问一、访问二和两次访问中都发生的唯一个体动物的数量(计数)。” 同样在您提供的文件中,有 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
让我知道这是否是您正在寻找的。
PS如果宠物在访问期间多次出现,代码将需要修改。
推荐阅读
- powershell - 使用具有不同参数的 powershell 脚本
- c# - C# - 使用 EndofLoop 无法获得正确的结果
- raspberry-pi - Raspberry Pi 将 USB 麦克风重定向到 hdmi 音频
- node-red - 客户需要一个帐户 SID
- c++ - C ++:将整数分配给整数指针
- angular - 从引导表迁移到 Angular5 数据表
- javascript - 日期处理不适用于 Internet Explorer,但适用于 Chrome 和 FF
- dkms - 仅为特定内核版本构建 dkms 模块
- cql - Confluence Rest API - 返回按位置排序的页面
- bash - ROS安装:没有这样的文件或目录