首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以字符串的形式操作数据帧

以字符串的形式操作数据帧
EN

Stack Overflow用户
提问于 2016-03-01 17:35:53
回答 1查看 51关注 0票数 1

我问了一个似乎很难解决的问题。我已经忙了好几天了。我试着把问题分解成较小的问题,这样我就能得到一些帮助。最初的问题是在这里从数据帧中提取信息

我有如下所示的数据框架

代码语言:javascript
运行
复制
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

在本例中,我有两列,但解决方案不应仅限于两列。

代码语言:javascript
运行
复制
> 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)

所以我会得到这样的输出

代码语言:javascript
运行
复制
M    repeated  COL1  COL2
4     3         2      1
1     1         1      -
15    1         -      1
16    1         -      1

我在想什么?多亏了阿肯,我才能融化df

代码语言:javascript
运行
复制
M1 <- melt(df, id.var=NULL)

输出将如下所示

代码语言:javascript
运行
复制
>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

然后,我使用下面的连字符拆分这些值。

代码语言:javascript
运行
复制
lst <- setNames(strsplit(M1$value, "-"), M1$variable)

现在我有了以下几点

代码语言:javascript
运行
复制
>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"

那我就不知道怎么走了

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-01 18:04:08

正如@akrun所解释的那样,“融化”数据并在"-"上拆分是一个良好的开端:

代码语言:javascript
运行
复制
library(data.table)

m = setDT(melt(df, id.var=NULL))
m[, c("pre","suff") := tstrsplit(value, "-", type.convert=TRUE)]

然后,您可以通过制表来总结数据:

代码语言:javascript
运行
复制
m[, table(suff, variable)]

#     variable
# suff s1 s2
#   1   1  0
#   4   2  1
#   15  0  1
#   16  0  1

更一般地,您可以按后缀的值进行分组并构造摘要统计数据:

代码语言:javascript
运行
复制
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

再把变量放进自己的列中.

代码语言:javascript
运行
复制
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包的介绍性材料,了解更多关于它如何工作以及您还能做什么的信息。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35729586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档