【问题标题】:R string split manipulation in a data frame does not work数据框中的 R 字符串拆分操作不起作用
【发布时间】:2015-11-20 05:12:54
【问题描述】:

这是一个简单的测试用例。

计划只拆分和提取每个字符串的第一部分。

library(dplyr)
library(stringr)
test = data.frame(x= c('a b', 'c d'),stringsAsFactors = F)

test
    x
1 a b
2 c d

test %>% mutate(y = str_split(x,'\\s+')[[1]][1])
    x y
1 a b a
2 c d a

期待类似的东西:

    x y
1 a b a
2 c d c

【问题讨论】:

  • str_split 的输出是list,所以你的索引是错误的。
  • @Chen 你应该使用 Aranda 库:library(splitstackshape);cSplit(test, 'x', ' ')
  • @ColonelBeauvel 我同意,但这是“阿南达”:)

标签: r string dataframe dplyr


【解决方案1】:

现在有各种打包函数可以将列拆分为多个部分。在这里,您可以使用 tidyr 包中的 separate() 函数。由于您想要空格分割的第一个值,您可以删除第一个空格之后的所有内容。

tidyr::separate(test, x, "y", "\\s.*", FALSE, extra = "drop")
#     x y
# 1 a b a
# 2 c d c

【讨论】:

  • 如今的孩子们拥有他们所有花哨的separate 功能。在我的日子里,我不得不在雪地里四英里的地方手动 strsplit.... 抱怨抱怨。
  • 上山,双向?那些讨厌的包裹无赖。
【解决方案2】:

str_split 返回一个列表,其中每个元素对应于原始原子向量中的一个元素。因此,您将需要使用lapply 或类似的适当索引

test %>% mutate(y = unlist(lapply(str_split(x,'\\s+'),'[[',1)))

【讨论】:

  • test %>% mutate(y=vapply(strsplit(x,"\\s+"),`[`, 1, FUN.VALUE=character(1))) - vapply ftw.
【解决方案3】:

我们也可以使用sub

library(data.table)
setDT(test)[, y:= sub('\\s+.*', '', x)]
test
#     x y
#1: a b a
#2: c d c

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多