【问题标题】:Identifying the frequency of items in the list识别列表中项目的频率
【发布时间】:2016-07-19 10:17:56
【问题描述】:

我有一个如下所示的数据框。

11,15,12,25
11,12
15,25
134,45,56
46
45,56
15,12
66,45,56,24,14,11,25,12,134

我想确定数据中出现对/三胞胎或更高的频率。例如,在上面的数据中,对的出现如下所示

item     No of occurrence
11,12      3
11,25      2
15,12      2
15,25      2
.
.
45,56      3
134,45,56  2    ....and so on

我正在尝试为上述内容编写 R 代码,但我发现难以处理。

【问题讨论】:

  • 请不要用您想要回答的所有标签来标记您的 Q。
  • 可以有dataframe的head()和str()
  • 那不是一个有效的数据框结构。
  • 如果您的数据框 dat 是一个列表,您可以执行类似 new <- lapply(lapply(dat, function(x) data.frame(table(x))),function(y) y[y$Freq>=2,]);new[sapply(new,function(z) nrow(z)>=1)] 的操作
  • 您好,我这里提供的数据只是我要应用函数的直接列。数据帧的head和str在这里的图片中找到[link] (imgur.com/IpM9Rtw)

标签: r reshape


【解决方案1】:

给定一个用逗号分隔变量的 1 列 data.frame,以下应该会产生您想要的结果:

# split column into a list
myList <- strsplit(df$V1, split=",")
# get all pairwise combinations
myCombos <- t(combn(unique(unlist(myList)), 2))

# count the instances where the pair is present
myCounts <- sapply(1:nrow(myCombos), FUN=function(i) {
                   sum(sapply(myList, function(j) {
                              sum(!is.na(match(c(myCombos[i,]), j)))})==2)})

# construct final matrix
allDone <- cbind(matrix(as.integer(myCombos), nrow(myCombos)), myCounts)

这将返回一个矩阵,其中前两列是比较项目,第三列是这些项目在 data.frame 行中的计数。

数据

df <- read.table(text="11,15,12,25
11,12
15,25
134,45,56
46
45,56
15,12
66,45,56,24,14,11,25,12,134", as.is=TRUE)

【讨论】:

  • @Imo 这很神奇。非常感谢。还有一件事,是否可以检查所有组合而不仅仅是配对。例如,制作所有可能的组合并计算数据框中特定组合的频率
  • 这是可能的,尽管编写代码有点乏味:您必须在 myCombos 更改的地方添加一个额外的循环,并调整 combn(, k) 的第二个参数。在这个新循环中,k 将从 2 调整为更大的整数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 2022-08-15
  • 2015-04-16
  • 2012-07-06
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
相关资源
最近更新 更多