【问题标题】:Count the occurence of values in a vector in DataFrame Columns计算 DataFrame Columns 中向量中值的出现次数
【发布时间】:2020-07-31 13:23:37
【问题描述】:

我是这个平台的新手,对 R 也很陌生,所以如果您在发布我的问题时发现有任何改进,请随时给我建议。

我目前正在使用 R 评估一项调查。

问题:将数据框除第一列之外的所有值与向量进行比较并计算向量中变量出现次数的最佳方法是什么?

在 Excel 中我会使用 countif 来解决我的问题,在 R 中我尝试了不同过滤器、group_by 和循环函数的组合 - 不幸的是没有成功。我在 Stack Overflow 上搜索了一个解决方案,但到目前为止还没有找到。也许我用了错误的关键字。

示例:

df<-data.frame(c("A","B","A","B","C"),c(-1,1,3,2,3),c(-3,-1,2,-1,2))
colnames(df)<- c("Participant-Type","Item 1","Item 2")

 Participant-Type Item 1 Item 2
1                A    -1     -3
2                B     1     -1
3                A     3      2
4                B     2     -1
5                C     3      2

vec <- c(-3,-2,-1,0,1,2,3)
[1] -3 -2 -1  0  1  2  3

我想查询数据框以了解不同参与者组选择向量中第 1 项和第 2 项的值的次数。参与者类型 A 的结果应如下所示:

TypeA <- data.frame(c("Item 1","Item 2"),c(0,1), c(0,0),c(1,0),c(0,0),c(0,0),c(0,1),c(1,0), row.names=1)
colnames(TypeA)<-c("-3","-2","-1","0","1","2","3")

       -3 -2 -1 0 1 2 3
Item 1  0  0  1 0 0 0 1
Item 2  1  0  0 0 0 1 0

在原始的Data-Set中也有很多NA值。

我知道如何仅从某个 Participant-Type 中选择行。我还发现,该表(df$Item1)为我提供了数据框中第 1 列变量的计数,但未使用的值不是结果的一部分。

我假设没有解决方案将数据框作为一个整体进行查询,所以我必须逐列将结果合并到一个DataFrame中。

但到目前为止,我还没有找到如何分别将列与向量进行比较,如何获取 DataFrame 的每列向量的变量计数。计算每列的唯一值将显示向量中未由参与者使用的变量的任何计数 (= 0)。

非常感谢任何帮助或建议!

编辑:

如果相关,原始 DataFrame 有 22 个变量(列)的 75 个观察值(行)。

【问题讨论】:

    标签: r


    【解决方案1】:

    dplyrtidyr 选项可以是:

    df %>%
     pivot_longer(-1) %>%
     count(name, value) %>%
     complete(value = vec, nesting(name), fill = list(n = 0)) %>%
     pivot_wider(names_from = "value", values_from = "n")
    
      name    `-3`  `-2`  `-1`   `0`   `1`   `2`   `3`
      <chr>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    1 Item 1     0     0     1     0     1     1     2
    2 Item 2     1     0     2     0     0     2     0
    

    或者如果需要在 Participant-Type 聚合:

    df %>%
     pivot_longer(-1) %>%
     count(name, `Participant-Type`, value) %>%
     complete(value = vec, nesting(name, `Participant-Type`), fill = list(n = 0)) %>%
     pivot_wider(names_from = "value", values_from = "n")
    
      name   `Participant-Type`  `-3`  `-2`  `-1`   `0`   `1`   `2`   `3`
      <chr>  <fct>              <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    1 Item 1 A                      0     0     1     0     0     0     1
    2 Item 1 B                      0     0     0     0     1     1     0
    3 Item 1 C                      0     0     0     0     0     0     1
    4 Item 2 A                      1     0     0     0     0     1     0
    5 Item 2 B                      0     0     2     0     0     0     0
    6 Item 2 C                      0     0     0     0     0     1     0
    

    【讨论】:

    • 这正是我想要的,并且适用于该示例。不幸的是,原始数据不起作用。 pivot_longer(-1) 已经抛出错误消息:Fehler:无法组合 FW03_01 FW03_02 。 x 某些属性不兼容。 ℹ 类的作者应该实现 vctrs 方法。 ℹ 见 vctrs.r-lib.org/reference/…>。 FW03_01 和 FW03_02 是列名,表示示例中的 Item 1 和 Item 2 等数据。
    • 或许尝试更新到dplyrtidyr的最新版本。
    • 似乎没有最新版本的 dplyr 和 tidyr 的二进制文件,我不知道如何从源代码进行设置 =/
    • 终于我成功了。我使用stackoverflow.com/a/53627541/14027466 中描述的方法从 DataFrame 中删除所有属性,然后您的方法确实适用于原始数据。非常感谢!
    【解决方案2】:

    在基础 R 中你可以这样做:

    grps <- interaction(df$`Participant-Type`, col(df[-1]))# Create the groupings   
    use_vec <- factor(unlist(df[-1]), vector) # Unlist your data
    do.call(rbind, tapply(use_vec, grps, table)) #Resulting table
        -3 -2 -1 0 1 2 3
    A.1  0  0  1 0 0 0 1
    B.1  0  0  0 0 1 1 0
    C.1  0  0  0 0 0 0 1
    A.2  1  0  0 0 0 1 0
    B.2  0  0  2 0 0 0 0
    C.2  0  0  0 0 0 1 0
    

    【讨论】:

    • 适用于示例!对于我的真实数据交互()返回警告:“在 ans * length(l) + if1 中:较长对象的长度不是较短对象长度的乘积”(翻译自德语)。 d.call() 然后返回错误:“tapply 中的错误(use_vec,grps,table):参数必须具有相同的长度”。如果相关,原始 DataFrame 有 22 个变量(列)的 75 个观察值(行)。
    • 由于数据是一个数据框,length(unlist(df[-1]))确实应该是length(df[,1])的倍数
    • 对于原始数据length(unlist(df[-1]))返回1575,length(df[,1])返回75,所以是倍数。您知道是什么导致了警告/错误吗?
    • @thuettel 你能尝试重新运行interaction(df[,1], col(df[-1]))吗?确保您确实有正确的参数,即df 确实是您的整个数据集
    • 对不起,你完全正确。我一定忘记用正确的名称替换 df 了。我仔细检查了,现在它可以工作了!非常感谢。只是为了我的理解,不同部分的作用是正确的:1.interaction() 将“参与者类型”列与剩余列的索引号组合在一起
    猜你喜欢
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    相关资源
    最近更新 更多