我问了一个似乎很难解决的问题。我已经忙了好几天了。我试着把问题分解成较小的问题,这样我就能得到一些帮助。最初的问题是在这里从数据帧中提取信息
我有如下所示的数据框架
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,1,4和第二列,我看到4,15和16,所以我会有3次4被重复,一次1,一次15和一次16。
4 3 1 1 15 1 16 1
如果我看看它们来自这些字符串的列,4来自第1列两次,一次来自列21来自第一列(s1) 15来自列(s2)一次来自第二列(s2)
所以我会得到这样的输出
M repeated COL1 COL2
4 3 2 1
1 1 1 -
15 1 - 1
16 1 - 1我在想什么?多亏了阿肯,我才能融化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"那我就不知道怎么走了
发布于 2016-03-01 18:04:08
正如@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请查看data.table包的介绍性材料,了解更多关于它如何工作以及您还能做什么的信息。
https://stackoverflow.com/questions/35729586
复制相似问题