数据导入和单元格作为带有数量的变量
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='')
我想导入行长度不均匀的 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='')