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