【问题标题】:strsplit into a variable number of columnsstrsplit 成可变数量的列
【发布时间】:2013-09-18 21:34:44
【问题描述】:

这是我之前提出的这个问题的后续:R for loop: create a new column with the count of a sub str from a different column

我有一个大表(100+ 列,50k+行)。其中一列包含以下格式的数据:

col
chicken
chicken,goat
cow,chicken,goat
cow

我想去:

col         col2         col3
chicken
chicken     goat
cow         chicken      goat
cow

需要填充的列多于 3 列,我只是将其剥离为示例。我的脚本创建了要填充的适当数量的列,我只需要代码,我假设它是一个 for 循环,将字符串拆分为 'col' on ',',然后将拆分的字符串放入后续列中。

感谢您的帮助!

【问题讨论】:

  • strsplit 在逗号上,然后是plyr::rbind.fill

标签: r for-loop multiple-columns string-split strsplit


【解决方案1】:
read.table(text="chicken
 chicken,goat
 cow,chicken,goat
 cow", fill=TRUE, sep=",")
# Trivial to change the names of dataframe columns
        V1      V2   V3
1  chicken             
2  chicken    goat     
3      cow chicken goat
4      cow       

【讨论】:

  • 这是我在 R-help 邮件列表中从 Gabor Grothendeick 那里学到的许多紧凑而优雅的问题解决方案之一。弄清楚为什么他对正则表达式问题的众多有效解决方案“有效”是我学习正则表达式的方式。
  • 在这里,我一直在想“哦,好吧,数据已经在 R 中了(损坏已完成),让我们看看我们能做些什么来清理”,而不是像你的回答那样 - 拿一个退后一步,提出更积极的解决方案。酷。
  • 也可以采用col1 向量并将其提供给 read.table(text=...) 然后将 cbind() 提供给原始数据帧。
  • ^^ 这个答案不会从R 工作区之外获取任何东西,即使它使用read.table,所以即使“损坏已经完成”,它也可以工作。跨度>
  • @Henrik,如果您查看concat.split 的帮助页面,您会发现我将我对这种方法的了解归功于 DWin,并将其实现为“紧凑”方法。但是,我在concat.split 中已经说明了这种方法的一个缺点:如果文件的前 5 行的字段少于任何后续行,则 R 会错误地包装数据。我使用的解决方案是首先使用 count.fields 并从中创建列名以强制 R 包含正确数量的列。
【解决方案2】:

你可以试试这个:

library(splitstackshape)
concat.split(data = df, split.col = 1, sep = ",", drop = TRUE)

#     col_1   col_2 col_3
# 1 chicken              
# 2 chicken    goat      
# 3     cow chicken  goat
# 4     cow 

【讨论】:

  • 不幸的是,我认为他们的数据包含一些空白行,而我在 CRAN 上的“splitstackshape”版本中没有考虑到这一点。
  • @Ananda Mahto,我实际上是多等了两分钟才让你有机会先给出答案。 ;)
猜你喜欢
  • 1970-01-01
  • 2021-01-06
  • 2016-04-13
  • 2017-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 2013-04-18
相关资源
最近更新 更多