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

时间:2017-04-27 18:40:11

标签: r data-manipulation

我想导入行长度不均匀的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个变量被视为新行,这完全没有意义)。我认为这是长度选项的问题。

1 个答案:

答案 0 :(得分:0)

dplyr&amp; 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='')