R 使用值作为字符串操纵数据帧
我问了一个似乎很难解决的问题。我已经忙了几天了。我试着把问题分解成更小的问题,这样我可能会得到一些帮助。原来的问题在这里 我有一个如下所示的数据框R 使用值作为字符串操纵数据帧,r,R,我问了一个似乎很难解决的问题。我已经忙了几天了。我试着把问题分解成更小的问题,这样我可能会得到一些帮助。原来的问题在这里 我有一个如下所示的数据框 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"
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
我想计算一个字符串在-之后重复了多少次,以及它们在每列中出现了多少次
假设我看第一列,我看到4,1,4和第二列,我看到4,15和16,所以我会有3次重复4,1次,15和16
我重复了一遍
4 3
1 1
15 1
16.1
如果我看一下它们来自这些字符串的列
4来自第1列两次,来自第2列一次
1来自第一列(s1)
15来自列(s2)一次
来自第二列(s2)一次
所以我会有这样的输出
M repeated COL1 COL2
4 3 2 1
1 1 1 -
15 1 - 1
16 1 - 1
>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
我在想什么?多亏了@Arkun,我可以融化df
M1 <- melt(df, id.var=NULL)
然后,我根据下面使用的连字符分割这些值
lst <- setNames(strsplit(M1$value, "-"), M1$variable)
然后我不知道如何进一步正如@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,则
setDT(M1)[,c(“pre”,“suff”):=tstrsplit(value,“-”);M1[,表(suff,变量)]
。您的“重复”列只是其他列的总和,可以在以后构建。@Frank这太神奇了,一部分没有任何循环就解决了:-),请将其作为答案,以便我能够感谢您的评论。如果可能的话,你能看看原来的问题吗?我相信你能帮助我,我喜欢并接受了你的解决方案。我从中学到了很多,我非常感激。谢谢bro@Frank好帖子。加上一个。@Mol如果您执行m=setDT(melt(df,id.var=NULL))[value!=“”]
,它可能会起作用。除此之外,我已经没有主意了。这对我来说确实有用。你能检查一下str(df)
@Mol吗?我试着读它df
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