根据行将单个列拆分为多个列

时间:2015-10-20 11:26:02

标签: r

我在R中有一个数据集,它由一个包含多个列中理想的变量的列组成。单列数据帧的结构就是这样。

A1
200
250
Brand x 
A2
400
300
Brand x
A4
100
320
Brand x2

我想以这样的方式拆分此列,使其最终出现在这样的多列框架中(“|”纯粹表示列分隔符):

A1 | 200 | 250 | Brand x  
A2 | 400 | 300 | Brand x1
A4 | 100 | 320 | Brand x2

我怎么能这样做?水平数据中大多数情况下都有一个序列 - 例如:4个变量 - A1,200,250,品牌x。朴素的等价物是在Excel中复制和转置粘贴,但是对于4个值的预定义序列。有人可以帮帮我吗?

4 个答案:

答案 0 :(得分:3)

这是我将如何做到的:

df2 <- as.data.frame(matrix(df1[,1], byrow=TRUE, ncol = 4))

或等同于:

df2 <- as.data.frame(t(matrix(df1[,1],nrow = 4)))

在这两种情况下都会产生预期的结果:

#> df2
#  V1  V2  V3       V4
#1 A1 200 250  Brand x
#2 A2 400 300  Brand x
#3 A4 100 320 Brand x2

数据

df1 <-read.table(text="A1
                       200
                       250
                       'Brand x' 
                       A2
                       400
                       300
                      'Brand x'
                       A4
                       100
                       320
                       'Brand x2'", header=FALSE)

答案 1 :(得分:2)

这不是一个优雅的解决方案,但应该有效。

一些解释:

前两行应仅提供您通常通过读取数据获得的数据帧。

如果列中有字符串,则会将此列转换为因子变量。出于这个原因,我将它在第3行中转换回了一个字符向量。

使用矩阵,您可以按照您想要的形状重新排列此向量,然后将其转换回数据帧(设置stringAsFactors=FALSE以防止所有内容都转换为默认值)。

但是,现在所有变量都是字符变量。因此,您需要适当地编码变量。

dat<-c("A1",200,250,"Brand x" ,"A2",400,0300, "Brand x", "A4",100,  320,"Brand x2")
dat<-data.frame(dat)
dat<-as.character(dat[,1])
dat<-matrix(dat, ncol = 4, byrow=TRUE)
dat<-data.frame(dat, stringsAsFactors = FALSE)

dat[] <- lapply(dat, type.convert)

> str(dat)
'data.frame':   3 obs. of  4 variables:
 $ X1: Factor w/ 3 levels "A1","A2","A4": 1 2 3
 $ X2: int  200 400 100
 $ X3: int  250 300 320
 $ X4: Factor w/ 2 levels "Brand x","Brand x2": 1 1 2

> dat
     X1  X2  X3       X4
 1 A1 200 250  Brand x
 2 A2 400 300  Brand x
 3 A4 100 320 Brand x2

答案 2 :(得分:1)

这里只是一个提示 - 如果序列总是重复(即确定性),你可以读取一个向量并改变维度,如:

data <- c("A1","200","250","Brand x","A2","400","300","Brand x","A4","100","320","Brand x2")
dim(data) <- c(4,3)
data <- t(data) # transpose
class(data)
data.df <- as.data.frame(data)
class (data.df)

这会将数据的暗淡变为矩阵(因为内部向量和矩阵的存储方式相同,因此不同的维度)。

执行时,将打印

> class(data)
[1] "matrix"
> class (data.df)
[1] "data.frame"

然后data.df就是一个data.frame对象,所以你可以在处理数据之前做任何你需要做的事情(例如将列更改为数字/字符/等)。

答案 3 :(得分:0)

如果总是4个值,下面的循环为我做了工作:

df <- read.csv("df.csv", sep = ";", header = FALSE)


new.df <- data.frame()
j <- 1
i <- 1
while(i < length(df[,1])-1){

    temp.df <- data.frame()

    temp.df[j,1] <- df[i,1]
    temp.df[j,2] <- df[i + 1, 1]
    temp.df[j,3] <- df[i + 2, 1]
    temp.df[j,3] <- df[i + 3, 1]

    new.df <- rbind(new.df, temp.df)

    j <- j + 1
    i <- i + 4
}
na.omit(new.df)

它没有完全优化,但它完成了工作!希望它适合你。