我在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个值的预定义序列。有人可以帮帮我吗?
答案 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)
它没有完全优化,但它完成了工作!希望它适合你。