【问题标题】:separating into columns in r - delimiter changes在 r 中分成列 - 分隔符更改
【发布时间】:2015-01-22 19:49:30
【问题描述】:

我想将单个列中包含的值拆分为新列。

我在一个文件中有一些看起来像这样的数据: > df V1 1 00006303657102064942660780914135165036 12867 15476 15473 15474 15397 14050 2 00006319625527159782351492300309533775 12867 15473 13678 13497 15397 3 00006327933867965144524703512179615086 12867 14245 15397 15473 15474

我想将每个值分成一个新列:V1、V2、V3、V4、V5 和 V6

我试过了:
df2 <- data.frame(do.call('rbind', strsplit(as.character(df$V1), ' ', fixed = FALSE)))

我最终得到这样的输出:

X1 X2 X3 X4 X5 X6 1 00006303657102064942660780914135165036 12867 15476 15473 15474 15397 2 00006319625527159782351492300309533775 12867 15473 13678 13497 15397 3 00006327933867965144524703512179615086 12867 14245 15397 15473 15474 X7 X8 1 14050 00006303657102064942660780914135165036 2 00006319625527159782351492300309533775 12867 3 00006327933867965144524703512179615086 12867

一些 v1 值最终出现在其他列中。这可能会发生,因为行尾没有空间。我怎样才能正确执行这个?

谢谢

【问题讨论】:

  • 如果您将read.table()sep = ' ' 一起使用,它会起作用吗? read.csv() 需要逗号作为分隔符。此外,第一行将有 7 列。第一行中的所有值都是有意的吗?
  • 尝试过:收到此错误:Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, : line 1 did not have 30 elements
  • R 期望每一行具有相同的列数。无论哪种方式,如果您砍掉第一行的最后一个值 (14050),那么您就是 df2 <- ... 行。我不确定您的整个数据集是什么样的,因此提供更多帮助有点困难。
  • 整个数据集要大得多,每行都有不同数量的列 - 基本上“00000xxxxxxxxxxxxxxx ..”是ID,其余的“12867”、“14050”等是组ID所属的。每个 ID 可以属于不同数量的组。行数以数百万计。确切的列数未知。
  • 也许列表更适合您的数据集。您可能在数据框中有一行包含许多 NA,这是不可取的。

标签: r csv strsplit read.csv


【解决方案1】:

好老的plyr 也可以:

txt <- readLines(n = 3)
1 00006303657102064942660780914135165036 12867 15476 15473 15474 15397 14050 
2 00006319625527159782351492300309533775 12867 15473 13678 13497 15397 
3 00006327933867965144524703512179615086 12867 14245 15397 15473 15474

library(plyr)
rbind.fill(
  lapply(
    strsplit(txt, " "), 
    function(y) {
      as.data.frame(t(y),stringsAsFactors=FALSE) # via @Arun http://stackoverflow.com/questions/17308551/do-callrbind-list-for-uneven-number-of-column
    }
  )
)
#   V1                                     V2    V3    V4    V5    V6    V7    V8
# 1  1 00006303657102064942660780914135165036 12867 15476 15473 15474 15397 14050
# 2  2 00006319625527159782351492300309533775 12867 15473 13678 13497 15397  <NA>
# 3  3 00006327933867965144524703512179615086 12867 14245 15397 15473 15474  <NA>

【讨论】:

  • 一个问题——文件很大——不知道在readLines里面贴几百万行是否可行,也不知道n的确切值。
  • @vagabond - 如果您没有在通话中指定n,那么readLines() 将一直读取到连接结束。无需粘贴。
  • txt 文件异常大 - 我达到了 8gb 的内存限制。除了获得更多内存 - 有什么方法可以部分实现这个功能?
【解决方案2】:
library(tidyr)
library(dplyr)

df <- read.table(
  header = FALSE, 
  text = "
00006303657102064942660780914135165036 12867 15476 15473 15474 15397 14050
00006319625527159782351492300309533775 12867 15473 13678 13497 15397
00006327933867965144524703512179615086 12867 14245 15397 15473 15474
",
  sep = "\n"
  )

df %>%
  separate(
    V1, 
    into = paste0("V", 1:7),
    # 'extra' allows the number of columns to differ by row
    extra = "drop"
    )

                                      V1    V2    V3    V4    V5    V6    V7
1 00006303657102064942660780914135165036 12867 15476 15473 15474 15397 14050
2 00006319625527159782351492300309533775 12867 15473 13678 13497 15397  <NA>
3 00006327933867965144524703512179615086 12867 14245 15397 15473 15474  <NA>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    相关资源
    最近更新 更多