【问题标题】:Breaking a row of data, by brackets用括号分隔一行数据
【发布时间】:2017-08-12 12:51:57
【问题描述】:

我正在尝试破坏一行数据。不幸的是,我所有的跑步都保存为一长排。

第一个值,是 ID 号。最后是性别。 (中间两个不需要)

[[131 22 2 "male"] [123 23 2 "female"] [232 21 2 "male"] [132 21 2 "male"]]

我想学习如何分行,所以括号中的每个值都被分隔到自己的单元格中,而不仅仅是括号中的一长行数据。

我的策略是让 R 识别“]”或“] [”之间的空格

这似乎是一个非常简单的问题,但我的字符串拆分、替换和其他参数不起作用。

请帮忙?我只是有点倾斜/沮丧!

非常感谢

【问题讨论】:

  • 为什么你的论点不起作用?当你尝试时会发生什么?显示您正在尝试的代码,以及您遇到的错误。
  • 哇,我真的很笨,我只需要将数据框更改为字符串,我的所有代码都可以正常工作。无论如何,感谢您的帮助!

标签: r text split


【解决方案1】:

您可以使用strsplit 和一些重塑功能一次性完成所有操作:

matrix(strsplit(txt, '[][ "]+')[[1]][-1], ncol=4, byrow=TRUE)
#     [,1]  [,2] [,3] [,4]    
#[1,] "131" "22" "2"  "male"  
#[2,] "123" "23" "2"  "female"
#[3,] "232" "21" "2"  "male"  
#[4,] "132" "21" "2"  "male" 

或者在清理完括号后通过read.table

read.table(text=gsub("^\\[\\[|\\] \\[|\\]\\]$", "\n", txt))
#   V1 V2 V3     V4
#1 131 22  2   male
#2 123 23  2 female
#3 232 21  2   male
#4 132 21  2   male

txt 在哪里:

txt <- '[[131 22 2 "male"] [123 23 2 "female"] [232 21 2 "male"] [132 21 2 "male"]]' 

【讨论】:

  • 另一种模式:"[][ ]{2,3}"
  • 嗯说非字符论点......有什么想法吗?
  • @usa_josh - 你可能有一个因素而不是字符向量。拆分时只需使用as.character(txt)
  • 如果您在 Google 上搜索过 - “strsplit 非字符参数中的错误”,第一个结果会告诉您:stackoverflow.com/questions/15430016/…
  • 哇,我真的很笨,我只需要将数据框更改为字符串,我的所有代码都可以正常工作。无论如何,感谢您的帮助!
【解决方案2】:

当我尝试 strsplit 时,它抱怨字符串中的特殊字符 [。正确的转义序列是两个反斜杠:

s = '[[131 22 2 "male"] [123 23 2 "female"] [232 21 2 "male"] [132 21 2 "male"]]' 
v0 = c(strsplit(s, "] \\["))

您将得到一个字符串数组,其中第一个字符串以 [[ 开头,最后一个字符串以 ]] 结尾。分别清理:

v1 = lapply(v0, function(s) gsub("\\[", "", s))
v2 = lapply(v1, function(s) gsub("]", "", s))

希望这会有所帮助!

【讨论】:

  • 嗯说有一个错误...非字符参数!有什么想法吗?
  • 哇,我真的很笨,我只需要将数据框更改为字符串,我的所有代码都可以正常工作。无论如何,感谢您的帮助!
【解决方案3】:

您可以使用tidyversereshapestringr 的组合来获得所需的结果。 separate_rows from tidyverse 分隔行,即将一行分成多行,类似地,separate from reshape 从旧列中分叉出新列。由于最后有两个右括号没有任何输出,我们得到两行带有NA 值和警告,因此我们使用na.omit() 删除NA 值。如果只想选择第一列和最后一列,可以使用select from dplyr

library(dplyr)
library(tidyverse)  # for separate_rows
library(reshape) #for separate to separate columns 
library(stringr) # for string manipulations i.e. remove tralining and leading white spaces 
# data frame from your data 
df_1 <- data.frame(col1='[[131 22 2 "male"] [123 23 2 "female"] [232 21 2 "male"] [132 21 2 "male"]]' , stringsAsFactors = FALSE)

# separate rows on closing brackets
df_2 <- df_1 %>%   separate_rows(col1, sep = "]")

# remove other remaining brackets and leading and triling white space
df_2["col1"] <- gsub("\\[|\\]", "", str_trim(df_2[["col1"]], "both") )

# separate the single column data to multiple columns
df_2 %>% separate(col = col1, into = c("ID", "Num1","Num2", "Gender"), sep = " ") %>% na.omit() %>% select(1,4)

输出将是

 A tibble: 4 × 2
     ID   Gender
  <chr>    <chr>
1   131   "male"
2   123 "female"
3   232   "male"
4   132   "male"

【讨论】:

  • 哇,谢谢!如果我说 500 行,我该怎么做呢?
  • 行数无关紧要,它应该扩展到任意行数。
猜你喜欢
  • 2019-09-23
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-22
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
相关资源
最近更新 更多