如何在R中组织我的CSV文件

时间:2015-09-24 15:42:21

标签: r excel-formula

我得到了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

2 个答案:

答案 0 :(得分:4)

使用base Rdata.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)
相关问题