【问题标题】:capture column pattern frequency捕获列模式频率
【发布时间】:2017-03-05 04:00:43
【问题描述】:

我有一个像下面这样的数据集

Id        A      B       C
10        1      0       1
11        1      0       1
12        1      1       0
13        1      0       0
14        0      1       1

我正在尝试像下面这样计算列模式。

 Pattern         Count
 A, C            2
 A, B            1
 A               1
 B, C            1

不知道从哪里开始,非常感谢任何帮助或建议。

【问题讨论】:

  • @Ty Voss 你需要这些基于 ID 的列的总和
  • 你用dplyr标记了这个,所以你也可以用df %>% gather(variable, value, -Id) %>% group_by(Id) %>% summarise(res = toString(variable[value == 1])) %>% count(res)
  • @Arunkumarmahesh,Arun,id 在这里无关紧要。好问题很难。

标签: r dplyr transform frequency reshape2


【解决方案1】:

首先“反转”两个独立向量中的数据列表:

w = which(dat[-1] == 1L, TRUE)

我们可以使用

table(tapply(names(dat)[-1][w[, "col"]], w[, "row"], paste, collapse = ", "))
#
#   A A, B A, C B, C 
#   1    1    2    1

如果结果不仅仅用于格式化目的,为了避免不必要的paste/strsplit,替代方案 - 在众多 - 中是:

pats = split(names(dat)[-1][w[, "col"]], w[, "row"])
upats = unique(pats)
data.frame(pat = upats, n = tabulate(match(pats, upats)))
#   pat n
#1 A, C 2
#3 A, B 1
#4    A 1
#5 B, C 1

【讨论】:

  • 这很完美。 ,我使用了as.data.frame,它不必使用最后三个拆分、唯一等。
【解决方案2】:

我们可以试试

table(gsub(",*N|N,*", "", chartr('0123', 'NABC', 
         do.call(paste, c(df1[-1] * col(df1[-1]), sep=",")))))

#  A A,B A,C B,C 
#  1   1   2   1 

正如@DavidArenburg 提到的,chartr 中的old/new 可以通过

cols <- paste(c("N", names(df1[-1])), collapse = "") 
indx <- paste(seq(nchar(cols)) - 1, collapse = "")
table(gsub(",*N|N,*", "", chartr(indx, cols, 
      do.call(paste, c(df1[-1] * col(df1[-1]), sep=",")))))

【讨论】:

  • 这很好,虽然不是很笼统,可能在chartr 中使用cols &lt;- paste(c("N", names(df[-1])), collapse = "") ; indx &lt;- paste(seq(nchar(cols)) - 1, collapse = "") 之类的东西而不是'0123' 和'NABC'
【解决方案3】:

如果您不必按 ID 分组,那么简单,

table(apply(df[-1], 1, function(i) paste(names(i[i == 1]), collapse = ',')))

#  A A,B A,C B,C 
#  1   1   2   1 

【讨论】:

  • 您可以通过转换为apply 之外的逻辑矩阵来改进这一点,例如apply(df[-1] == 1, 1, function(i) toString(names(i[i])))
猜你喜欢
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 2017-10-21
  • 1970-01-01
  • 2021-03-02
相关资源
最近更新 更多