【问题标题】:R: formating a dataframe in two specific ways based on separation and matchingR:基于分离和匹配以两种特定方式格式化数据帧
【发布时间】:2011-06-02 05:14:37
【问题描述】:

我有一个这样的 df1:

    A                 B
1 xxx      B2341; A3456
2 yyy B2341; CC6x; GG63
3 zzz              CC6X
4 www              GG63
5 kkk              5634

为了获取df1,我使用以下命令

 df1 <- data.frame(A=c("xxx", "yyy", "zzz", "www", "kkk"), B=c("B2341; A3456", "B2341; CC6x; GG63", "CC6X", "GG63", "5634"))

在第一步中,我想将 B 列中的所有项目(由 ; 和空格分隔)分隔到这样的表格中。因为我想根据这个表格格式做一些分析。但是,由于每个单元格的项目不均匀。我想请你帮忙完成它。

xxx B2341
xxx A3456
yyy B2341
yyy CC6X
yyy GG63
zzz CC6X
www GG63
kkk 5634

第二步,我想根据df2第2列的匹配结果得到一个表,即xxx和yyy都在df2第2列得到B2341。 yyy 和 zzz 也获得了 CC6X; yyy 和 www 也得到了 GG63。

所以,我想要一个包含两列显示匹配行的 df,例如:

xxx yyy
yyy zzz
yyy www

请帮助指导如何以更智能的方式基于我的 df1 和 R 获取两个数据帧。谢谢。

【问题讨论】:

  • CC6x,其中x是小写,应该和CC6X一样吗?

标签: r dataframe


【解决方案1】:

第一步:

library(reshape)
x <- melt((strsplit(as.character(df1$B), "; ")))
x <- data.frame("A"=df1[x$L1,1],"B"=x$value)

x:

  value L1 match
1 B2341  1   xxx
2 A3456  1   xxx
3 B2341  2   yyy
4  CC6x  2   yyy
5  GG63  2   yyy
6  CC6X  3   zzz
7  GG63  4   www
8  5634  5   kkk

第 2 步:

y <- unique(merge(x,x[duplicated(x$B),],by="B")[2:3])
y[y$A.x != y$A.y,]

y:

  A.x A.y
1 xxx yyy
3 yyy www

注意:第 2 步的结果与您指定的不完全相同,因为我认为您将“CC6X”错误输入为“CC6x”,如果您希望它忽略大写,我建议您使用 x$B &lt;- tolower(x$B)

【讨论】:

    【解决方案2】:

    这看起来像是 foreach 包的工作。我以某种方式将它用于我用 R 编写的所有内容。

    library(foreach)
    foreach(a=df1$A, b=as.character(df1$B), .combine=rbind) %do% {
        data.frame(A=a, B=strsplit(b, "; ")[[1]])
    }
    

    输出:

        A     B
    1 xxx B2341
    2 xxx A3456
    3 yyy B2341
    4 yyy  CC6x
    5 yyy  GG63
    6 zzz  CC6X
    7 www  GG63
    8 kkk  5634
    

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-16
      • 2015-12-08
      • 2018-01-19
      • 2018-03-18
      相关资源
      最近更新 更多