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