【问题标题】:Data Import and cells as variables with quantities数据导入和单元格作为具有数量的变量
【发布时间】:2017-04-27 18:40:11
【问题描述】:

我想导入没有偶数行长度的 txt 文件,并且每一行都包含带有出现数量或没有任何变量的变量名称 - 只是 ID。每一列都用空格隔开。

样本数据如下:

V1   V2   Variables:Qty
1234 0001 38571:20
1235 0007 83744:1 74572:12 29401:12
8485 1284 74572:1 38571:16
9412 8310

我需要达到的目标如下:

V1   V2   38571 83744 74572 29401
1234 0001 20    0     0     0
1235 0007 0     1     12    12
8485 1284 16    0     1     0
9412 8310 0     0     0     0

数据文件很大,包含超过 8000 行和 600 个唯一变量 (XXXXX:X),如前所述,每列以空格分隔。

如果有人对如何做有一些建议,请告知。我想到了 dplyr/tidyr 中的任何一个,但不知道如何解决它。

编辑: 原始数据文件:

1234 0001 38571:20
1235 0007 83744:1 74572:12 29401:12
8485 1284 74572:1 38571:16
9412 8310

我用下面的代码加载它:

data <- data.table(read.table("data.txt", sep = " ", fill = TRUE))

我的 data.frame 有 5 列

  V1   V2       V3       V4       V5
1: 1234    1 38571:20                  
2: 1235    7  83744:1 74572:12 29401:12
3: 8485 1284  74572:1 38571:16         
4: 9412 8310                           

我还有一个问题,在使用 R 上方的代码导入我的实际数据后,仅生成 26 个变量,而它应该超过 50 列(剩余的 24 个变量被视为新行,这绝对没有意义)。我认为这是长度选择的问题。

【问题讨论】:

标签: r data-manipulation


【解决方案1】:

dplyr & tidyr:

library(tidyr)
library(dplyr)
df1 %>% 
  separate_rows(Variables.Qty, sep = ' ') %>% 
  separate(Variables.Qty, c('Variables','Qty'), sep = ':') %>% 
  spread(Variables, Qty, fill = 0) %>% 
  select(-7)

结果:

    V1   V2 29401 38571 74572 83744
1 1234 0001     0    20     0     0
2 1235 0007    12     0    12     1
3 8485 1284     0    16     1     0
4 9412 8310     0     0     0     0

对于更新的数据:

library(tidyr)
library(dplyr)
library(readr)
rawdata %>% 
  gather(key, val, 3:5) %>% 
  separate(val, c('Variables','Qty'), sep = ':') %>% 
  mutate(Qty = as.numeric(Qty)) %>% 
  spread(Variables, Qty, fill = 0) %>% 
  mutate(key = parse_number(key), key = cumsum(key < lag(key, default = 0))) %>% 
  select(-8) %>% 
  group_by(V1, V2, key) %>% 
  summarise_all(sum) %>% 
  select(-key)

结果:

Source: local data frame [4 x 6]
Groups: V1, V2 [4]

     V1    V2 `29401` `38571` `74572` `83744`
  <chr> <chr>   <dbl>   <dbl>   <dbl>   <dbl>
1  1234  0001       0      20       0       0
2  1235  0007      12       0      12       1
3  8485  1284       0      16       1       0
4  9412  8310       0       0       0       0

此答案中使用的数据:

df1 <- read.table(text="V1   V2   Variables:Qty
                        1234 0001 '38571:20'
                        1235 0007 '83744:1 74572:12 29401:12'
                        8485 1284 '74572:1 38571:16'
                        9412 8310 ''",
                  header=TRUE, colClasses='character')

rawdata <- read.table(text="1234 0001 38571:20
                            1235 0007 83744:1 74572:12 29401:12
                            8485 1284 74572:1 38571:16
                            9412 8310",
                      header=FALSE, colClasses='character', fill=TRUE, na.strings='')

【讨论】:

  • 感谢您的回复,我编辑了我的帖子。关键是我得到的不是 3 列而是 5 列,但是您的解决方案让我想到了合并列而不是运行您的代码 - 另一个问题是 R 只为我的实际数据生成 26 个变量,我认为这是由一些与相关的选项设置引起的txt 文件。
  • @Maniek 我已经更新了我的答案。这能解决您的问题吗?
  • 感谢您的解决方案 - 我认为它是可扩展的并且可以工作,但我在导入最终数据时遇到问题。看起来 R 只能从 txt 文件中导入有限数量的变量/字符(因为我计算了每行 250 个字符 - 在我的情况下为 26 个变量),其余变量被移动到新行 - 它在数据中没有任何意义。解决这个奇怪的问题后,我会确认您的解决方案有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
相关资源
最近更新 更多