数据导入和单元格作为带有数量的变量

Data Import and cells as variables with quantities

我想导入行长度不均匀的 txt 文件,每行包含变量名称和出现次数或没有任何变量 - 只是 ID。每列由 space.

分隔

示例数据如下:

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),如前所述,每一列由 space 分隔。

如果有人有一些建议如何去做,请指教。我想到了 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 个变量被视为新行,这完全没有意义)。我认为这是长度选项的问题。

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='')