将庞大的数据库分成几列

时间:2015-10-24 11:28:55

标签: r

我开始管理一个巨大的(几万条记录)数据,我需要把它分成几列。数据库正在重复,如:

a 2,1
b 3,4
c 3,2
d 2,5
a 3,5
b 4,7
c 8,1
d 5,1
a ...

等等。一个圆圈是1024个记录长,一个数据库是几万个。你知道我怎么能把它安排到表格中,比如:

a 2,1 3,5 ...
b 3,4 4,7
c 3,2 8,1
d 2,5 5,1

如果我可以为每一列添加一个数字,那将是很好的,例如:

 0,2 0,4 0,6 0,8...
a 2,1 3,5 ...
b 3,4 4,7
c 3,2 8,1
d 2,5 5,1

但这并不重要。

3 个答案:

答案 0 :(得分:1)

我们可以使用dcast中的library(data.table)。我们将'data.frame'转换为'data.table'(setDT(df1)),创建一个按'v1'分组的序列列('N'),然后使用从'long'到'wide'格式重新整形与dcast

library(data.table)#v1.9.6+
dcast(setDT(df1)[, N:= paste0('val', 1:.N), by = v1], v1~N, value.var='v2')
#    v1 val1 val2
#1:  a  2,1  3,5
#2:  b  3,4  4,7
#3:  c  3,2  8,1
#4:  d  2,5  5,1

在devel版本v1.9.7中,我们可以使用rowid

创建序列列
dcast(setDT(df1), v1~rowid(v1, prefix='val'), value.var='v2')

数据

df1 <- structure(list(v1 = c("a", "b", "c", "d", "a", "b", "c", "d"), 
v2 = c("2,1", "3,4", "3,2", "2,5", "3,5", "4,7", "8,1", "5,1"
)), .Names = c("v1", "v2"), class = "data.frame", row.names = c(NA, 
-8L))

答案 1 :(得分:1)

另一种选择,与@akrun相同,使用tidyr

library(dplyr)
library(tidyr)

df1 %>% 
  group_by(v1) %>% 
  mutate(v0 = paste0('val', 1:n())) %>% 
  spread(v0, v2)

给出了:

#Source: local data frame [4 x 3]
#
#     v1  val1  val2
#  (chr) (chr) (chr)
#1     a   2,1   3,5
#2     b   3,4   4,7
#3     c   3,2   8,1
#4     d   2,5   5,1

答案 2 :(得分:0)

我认为以长篇形式提供这些数据会更容易:

library(dplyr)
library(tidyr)
library(stringi)

df1 %>%
  mutate(record = 1:n(),
         v2 = v2 %>% stri_split_fixed(",") ) %>%
  unnest(v2) %>%
  group_by(record) %>%
  mutate(order = 1:n())

记录和订单列都是可选的。