【问题标题】:R: Extract character string elements to new columnsR:将字符串元素提取到新列
【发布时间】:2018-08-03 11:14:29
【问题描述】:

我在 R 中有一个包含 1000 行的数据框,变量 var1_string 是一个字符串,如下所示:

var_1_ID   var1_string
1          "object.ID = 00001, object.ID.N = 1, object.subfeature.ID = 55555, object.subfeature.e1 = 1, object.subfeature.e2 = False, object.subfeature.ID = 66666,object.subfeature.e1 = 2, object.subfeature.e4 = 50 object.subfeature.e9 = abc, object.feature = 3, object.feature = cd, object.feature = ab.."
2          "object.ID = 00001, object.ID.N = 1, object.subfeature.ID = 55555, object.subfeature.e1 = 1, object.subfeature.e2 = False, object.subfeature.ID = 66666,object.subfeature.e1 = 2, object.subfeature.e4 = 50 object.subfeature.e9 = abc, object.feature = 3, object.feature = cd, object.feature = ab.."

and so on for n rows...

有没有一种快速的方法可以将以下内容提取到新列中:

new_column_1 ="object.ID = 00001, object.ID.N = 1"

new_column_2 到 new_column_n 将包含 "object.subfeature.ID.... 到下一个 object.subfeature.ID,依此类推,直到没有更多子功能.....

所以在这个例子中:

new_column_2 = object.subfeature.ID = 55555, object.subfeature.e1 = 1, object.subfeature.e2 = False,

然后下一列包含下一个object.subfeature.ID 块,例如object.subfeature.ID = 66666,object.subfeature.e1 = 2, object.subfeature.e4 = 50

最后是所有object.features..的单独列\

例如所需的输出:

Var_1_ID   Var1_string      New_col1                             New_col2                                                                         New_col3
1          String as above  object.ID = 00001, object.ID.N = 1   object.subfeature.ID = 55555,  object.subfeature.e1 = 1, object.subfeature.e2 = False                    object.subfeature.ID = 66666,object.subfeature.e1 = 2, object.subfeature.e4 = 50 
                            object.subfeature.e9 = abc, object.feature = 3, object.feature = cd, object.feature = ab..
2          String as above  object.ID = 00001, object.ID.N = 1

有没有办法使用子字符串?还是必须使用stringr::str_extract / dplyr::mutate(strsplit...)?

注意:可能有任意数量的 object.subfeatures,例如 `object.subfeature.ID = 55555 及其部分,从 0 到 n

【问题讨论】:

  • 请发布到控制台dput(YOURDATA[1:3,]) 并在此处发布结果!
  • tidyr 分开,但是你将如何处理不同数量的元素的不同字符串长度,但仍然像上面那样分成新列?
  • 预期输出描述不佳

标签: r string substring dplyr


【解决方案1】:

我认为这可能是一个好的开始

library(tidyverse)
df <- data_frame(Var_1_ID = c(1,2), Var1_string = c("object.ID = 00001, object.ID.N = 1, object.subfeature.ID = 55555, object.subfeature.e1 = 1, object.subfeature.e2 = False, object.subfeature.ID = 66666,object.subfeature.e1 = 2, object.subfeature.e4 = 50 object.subfeature.e9 = abc, object.feature = 3, object.feature = cd", "object.ID = 00001, object.ID.N = 1, object.subfeature.ID = 55555, object.subfeature.e1 = 1, object.subfeature.e2 = False, object.subfeature.ID = 66666,object.subfeature.e1 = 2, object.subfeature.e4 = 50 object.subfeature.e9 = abc, object.feature = 3, object.feature = cd"))

df2 <- df %>% mutate(newstring = str_split(Var1_string, ",")) %>% 
    unnest() %>%
    separate(newstring, into = c("col", "val"), sep = "=") %>% 
    select(-Var1_string)%>%
    group_by(Var_1_ID)%>%
    mutate(key = row_number())%>%
    unite("new_var", key, col, sep = "_")%>%
    spread(new_var, val)

df2
  Var_1_ID `1_object.ID ` `10_ object.featu… `2_ object.ID.N… `3_ object.subfea… 
1        1 " 00001"       " cd"              " 1"             " 55555"           " 1"           
2        2 " 00001"       " cd"              " 1"             " 55555"           " 1"        

请注意,我必须在变量中添加一个 nuber,以使每一列都具有唯一性以进行传播。

【讨论】:

  • 谢谢,这不是增加行吗?而不是将字符串拆分到新列?
  • 这是长格式。你说的是宽格式。没时间玩太久,不过一般可以用 tidy::spread 从长变宽
  • 这不是 OP 要求的。 OP 需要将一列分成多列。
  • 由于并非 col 中的所有字符串在每个组中都是唯一的,我建议按 ID 分组,为每个组生成唯一的 id 代码,将唯一键与字符串结合,然后传播数据。如果你有问题,我可以在下午晚些时候再来处理
  • @AndS. 那会有用的请
【解决方案2】:
#Prepare data to be split on `;`
data$Var1_string <- gsub("(object.ID.N = [0-9]),",'\\1;',data$Var1_string)
data$Var1_string <- gsub("(object.subfeature.e[0-9] = [0-9a-zA-Z]+)[^a-z]",'\\1;',data$Var1_string)
data$Var1_string <- gsub("(object.subfeature.ID = [0-9a-zA-Z]+)[^a-z]",'\\1;',data$Var1_string)

ncol <- max(lengths(strsplit(data$Var1_string,split = ';')))

library(tidyr)
data <- data %>% separate(Var1_string,into = paste0('Col',1:ncol),sep=';',remove = FALSE)

colnames(data)[3:11] <- c('New_col','object.subfeature.ID.e1','object.subfeature.e1','object.subfeature.e2','object.subfeature.ID.e11','object.subfeature.e11','object.subfeature.e14','object.subfeature.e19','object.features')

data %>% mutate_at(vars(contains('object.subfeature')), 
                  .funs = funs(gsub("object.subfeature.e[0-9] = |object.subfeature.ID = ", '', .)))

  Var_1_ID
1        1
2        2

Var1_string
1 object.ID = 00001, object.ID.N = 1; object.subfeature.ID = 55555; object.subfeature.e1 = 1; object.subfeature.e2 = False; object.subfeature.ID = 66666;object.subfeature.e1 = 2; object.subfeature.e4 = 50;object.subfeature.e9 = abc; object.feature = 3, object.feature = cd, object.feature = ab..
2 object.ID = 00001, object.ID.N = 1; object.subfeature.ID = 55555; object.subfeature.e1 = 1; object.subfeature.e2 = False; object.subfeature.ID = 66666;object.subfeature.e1 = 2; object.subfeature.e4 = 50;object.subfeature.e9 = abc; object.feature = 3, object.feature = cd, object.feature = ab..
                         New_col object.subfeature.ID.e1 object.subfeature.e1
1 object.ID = 00001, object.ID.N = 1                   55555                    1
2 object.ID = 00001, object.ID.N = 1                   55555                    1
object.subfeature.e2 object.subfeature.ID.e11 object.subfeature.e11 object.subfeature.e14
 1                False                    66666                     2                    50
 2                False                    66666                     2                    50
 object.subfeature.e19                                                 
 object.features
 1                   abc  object.feature = 3, object.feature = cd, 
 object.feature = ab..
 2                   abc  object.feature = 3, object.feature = cd, 
 object.feature = ab..

数据

 data <- read.table(text="
         Var_1_ID   Var1_string
         1          'object.ID = 00001, object.ID.N = 1, object.subfeature.ID = 55555, object.subfeature.e1 = 1, object.subfeature.e2 = False, object.subfeature.ID = 66666,object.subfeature.e1 = 2, object.subfeature.e4 = 50 object.subfeature.e9 = abc, object.feature = 3, object.feature = cd, object.feature = ab..'
         2          'object.ID = 00001, object.ID.N = 1, object.subfeature.ID = 55555, object.subfeature.e1 = 1, object.subfeature.e2 = False, object.subfeature.ID = 66666,object.subfeature.e1 = 2, object.subfeature.e4 = 50 object.subfeature.e9 = abc, object.feature = 3, object.feature = cd, object.feature = ab..'
               ",header=T, stringsAsFactors = F)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 2020-11-08
    • 2022-01-08
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 2015-03-29
    相关资源
    最近更新 更多