【问题标题】:R Split delimited strings in a column and insert as new column (in binary) [duplicate]R在列中拆分分隔字符串并作为新列插入(二进制)[重复]
【发布时间】:2017-07-31 04:18:02
【问题描述】:

我有如下数据框

+---+-----------+
|lot|Combination|
+---+-----------+
|A01|A,B,C,D,E,F|
|A01|A,B,C      |
|A02|B,C,D,E    |
|A03|A,B,D,F    |
|A04|A,C,D,E,F  |
+---+-----------+

每个字母表都是一个用逗号分隔的字符,我想在每个逗号上拆分“组合”并将拆分后的字符串以二进制形式作为新列插入。例如,所需的输出将是:

+---+-+-+-+-+-+-+
|lot|A|B|C|D|E|F|  
+---+-+-+-+-+-+-+
|A01|1|1|1|1|1|1|
|A01|1|1|1|0|0|0|
|A02|0|1|1|1|1|0|
|A03|1|1|0|1|0|1|
|A04|1|0|1|1|1|1|
+---+-+-+-+-+-+-+

任何帮助将不胜感激:)

【问题讨论】:

  • 当我检查我的答案是否真的有效时,请查看此帖子:stackoverflow.com/questions/5963269/… 并编辑您的问题并将图像交换为真实数据:)
  • library(splitstackshape); cSplit_e(df, "Combination", type = "character", fill = 0) 应该这样做......

标签: r dataframe reshape strsplit


【解决方案1】:

使用dplyrtidyr 的解决方案。 dt2 是最终输出。

# Load packages
library(dplyr)
library(tidyr)

# Create example data frame
dt <- lot <- c("A01", "A01", "A02", "A03","A04")
Combination <- c("A,B,C,D,E,F", "A,B,C","B,C,D,E", "A,B,D,F", "A,C,D,E,F")
dt <- data_frame(lot, Combination)

# Process the data
dt2 <- dt %>%
  mutate(ID = 1:n()) %>%
  mutate(Combination = strsplit(Combination, split = ",")) %>%
  unnest() %>%
  mutate(Value = 1) %>%
  spread(Combination, Value, fill = 0) %>%
  select(-ID)

【讨论】:

  • 谢谢!有用!!结果正是我想要的:)
【解决方案2】:

请以可直接用作回答者输入的形式提供您的示例输入数据。我在这里自己添加了相同的示例数据。希望有帮助。

library(tidyr)
library(dplyr)
lot <- c("A01", "A02", "A03","A04")
Combination <- c("A,B,C,D,E,F", "A,B,C","B,C,D,E", "A,C")
df <- data.frame(lot, Combination)
df

separate(df, Combination, into=paste("V",1:6, sep=""), sep=",") %>%
    gather(key, value,-lot) %>%
    filter(!is.na(value)) %>%
    mutate(yesno = 1) %>%
    distinct %>%
    spread(value, yesno, fill = 0) %>% select(-key)

要了解这里发生的情况,请分别从单独的() 开始运行每个步骤。 %>% 是一个管道运算符,用于将上一行的结果作为下一行的第一个参数相加。

【讨论】:

    【解决方案3】:

    另一种选择,使用方便的separate_rows() 函数:

    df <- read.table( text = "lot|Combination
    A01|A,B,C,D,E,F
    A01|A,B,C
    A02|B,C,D,E
    A03|A,B,D,F    
    A04|A,C,D,E,F", sep ="|", header = TRUE) 
    
    library(tidyverse)
    df %>%
      mutate(id = row_number(), flg = 1) %>%
      separate_rows(Combination, sep = ",") %>%
      spread(Combination, flg)
    

    给予:

      lot id  A  B  C  D  E  F
    1 A01  1  1  1  1  1  1  1
    2 A01  2  1  1  1 NA NA NA
    3 A02  3 NA  1  1  1  1 NA
    4 A03  4  1  1 NA  1 NA  1
    5 A04  5  1 NA  1  1  1  1
    

    【讨论】:

      猜你喜欢
      • 2019-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      相关资源
      最近更新 更多