我开始管理一个巨大的(几万条记录)数据,我需要把它分成几列。数据库正在重复,如:
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
但这并不重要。
答案 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())
记录和订单列都是可选的。