r - 比较R中同一列中的两个变量

标签 r comparison intersect

我有两列。一个有变量列表,例如“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))
}

最佳答案

说实话,输出矩阵不是很清楚。但是,您在评论中提到您正在“寻找每次访问中仅在访问第一次、仅在访问第二次和两次访问中都发生的独特个体动物的数量(计数)。”在您提供的文件中也有 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 

如果这就是您要找的,请告诉我。

附言如果宠物在访问期间可能出现多次,则需要修改代码。

关于r - 比较R中同一列中的两个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52503285/

相关文章:

r - 准备一个规则交易 list

mysql - MongoDB 与 MySQL

比较输入的 ASCII 值(C 程序)

sql - 强制 MySQL 在 Join 上使用两个索引

android - 如何编写 Android SQLite 数据库 INTERSECT 查询

r - 将具有特定值的新行添加到第一列中,然后将 "-"添加到其余列中

r - GLM 逻辑回归的有效起始值错误

r - 在R中工作时无法在Windows OS中安装RopenCVLite

java - 两个随机数组之间的最小值?

mysql - MySQL中的相交