我得到了53000行的.csv文件,如下所示:
s
1
2
3
m
4
5
6
7
r
8
9
10
11
我想使用R或excel格式化以下格式:
s 1 2 3
m 4 5 6 7
r 8 9 10 11
答案 0 :(得分:4)
使用base R
和data.table
的三种替代实施方式:
1:,基数为R
df$id <- cumsum(grepl("\\D", df$x))
df$name <- ave(df$x, df$id, FUN = function(x) rep(x[1],length(x)))
df <- df[!grepl("\\D", df$x),]
df$pos <- ave(df$x, df$name, FUN = function(x) paste0("p",1:length(x)))
library(reshape2)
dcast(df, name ~ pos, value.var = "x")
这给出了:
name p1 p2 p3 p4
1 m 4 5 6 7
2 r 8 9 10 11
3 s 1 2 3 <NA>
2:第一次使用data.table
library(data.table)
dcast(setDT(df)[, id := cumsum(grepl("\\D", x))
][, `:=` (name = x[1], pos = 0:(.N-1)), id
][!grepl("\\D", x), .(name, x, pos=paste0("p",pos))],
name ~ pos, value.var = "x")
3:使用data.table
的第二种方法,但现在使用开发版本(installation instructions)中刚刚介绍的rowid
函数:
library(data.table) # v1.9.7+
dcast(setDT(df)[, id := cumsum(grepl("\\D", x))
][, name := x[1], id
][!grepl("\\D", x), .(name, x)],
name ~ rowid(name, prefix="p"), value.var = "x")
两种data.table
方法都会导致:
name p1 p2 p3 p4
1: m 4 5 6 7
2: r 8 9 10 11
3: s 1 2 3 NA
使用过的数据:
df <- data.frame(x = c("s", 1:3, "m", 4:7, "r", 8:11), stringsAsFactors = FALSE)
答案 1 :(得分:2)
假设新行名称始终为字母数字且行中的值始终为数字,则会将其重新格式化为您可能正在查找的数据框。
library(dplyr)
library(tidyr)
data.frame(x = c("s", 1:3, "m", 4:7, "r", 8:11),
stringsAsFactors = FALSE) %>%
mutate(var_id = cumsum(grepl("[[:alpha:]]", x))) %>%
group_by(var_id) %>%
mutate(row_name = x[1]) %>%
filter(!grepl("[[:alpha:]]", x)) %>%
mutate(var_index = 1:n()) %>%
ungroup() %>%
select(-var_id) %>%
spread(var_index, x)