我问了一个似乎很难解决的问题。我已经忙了好几天了。我尝试将问题分解为较小的问题,以便我可以得到一些帮助。最初的问题是extract information from a data frame
我有一个如下数据框
df<- structure(list(s1 = structure(1:3, .Label = c("3-4", "4-1", "5-4"
), class = "factor"), s2 = structure(1:3, .Label = c("2-4", "3-15",
"7-16"), class = "factor")), .Names = c("s1", "s2"), row.names = c(NA,
-3L), class = "data.frame")
Looks like below
在此示例中,我有两列,但解决方案不应仅针对两列
> df
# s1 s2
#1 3-4 2-4
#2 4-1 3-15
#3 5-4 7-16
我想计算一个字符串在重复之后的次数以及它们在每列中出现的次数
让我们说如果我看第一列,我会看到4,14和第二列,我看到4,15和16,所以我将有3次4次重复,一次1次,一次15次,一次16次< / p> 重复了M 4 3 1 1 15 1 16 1
如果我查看它们来自这些字符串的列 4列来自第1列,第2列来自第2列 1从第一列开始一次(s1) 15列来自列(s2) 来自第二栏(第二栏)
所以我会得到像这样的输出
M repeated COL1 COL2
4 3 2 1
1 1 1 -
15 1 - 1
16 1 - 1
我在想什么?感谢@Arkun,我可以融化df
M1 <- melt(df, id.var=NULL)
输出将是这样的
>M1
# variable value
# 1 s1 3-4
# 2 s1 4-1
# 3 s1 5-4
# 4 s2 2-4
# 5 s2 3-15
# 6 s2 7-16
然后我使用下面的
分割基于连字符的值lst <- setNames(strsplit(M1$value, "-"), M1$variable)
现在我有以下
>lst
#$s1
#[1] "3" "4"
#$s1
#[1] "4" "1"
#$s1
#[1] "5" "4"
#$s2
#[1] "2" "4"
#$s2
#[1] "3" "15"
#$s2
#[1] "7" "16"
然后我不知道如何进一步了解
答案 0 :(得分:3)
正如@akrun所解释的那样,“融化”数据并在"-"
上分裂是一个良好的开端:
library(data.table)
m = setDT(melt(df, id.var=NULL))
m[, c("pre","suff") := tstrsplit(value, "-", type.convert=TRUE)]
然后,您可以通过制表来总结数据:
m[, table(suff, variable)]
# variable
# suff s1 s2
# 1 1 0
# 4 2 1
# 15 0 1
# 16 0 1
更一般地说,您可以按后缀的值进行分组并构建摘要统计信息:
summ = m[, .(
N = .N,
pre = paste(sort(unique(pre)), collapse=",")
), keyby=.(suff, variable)]
# suff variable N pre
# 1: 1 s1 1 4
# 2: 4 s1 2 3,5
# 3: 4 s2 1 2
# 4: 15 s2 1 3
# 5: 16 s2 1 7
再次将变量放在各自的列中......
dcast(summ, suff~variable, value.var=c("N","pre"))
# suff N_s1 N_s2 pre_s1 pre_s2
# 1: 1 1 NA 4 NA
# 2: 4 2 1 3,5 2
# 3: 15 NA 1 NA 3
# 4: 16 NA 1 NA 7
查看introductory materials for the data.table package了解更多信息,了解其工作原理以及您可以采取的其他措施。