2016-09-13 61 views
2
dfOrig <- data.frame(rbind("1", 
         "C", 
         "531404", 
         "3", 
         "B", 
         "477644")) 
setnames(dfOrig, "Value") 

我有一个单列向量,它实际上包含两个三个变量的观察值。如何将其转换为一个data.frame结构如下:将单列数据帧转换为具有多行和命名列的数据帧

ID  Code  Tag 
"1"  "C"  "531404" 
"3"  "B"  "477644" 

显然,这只是一个玩具的例子来说明有更多的观察和变量的一个真实世界的问题。

+0

所以,你必须创建更多列而不仅仅是'ID','Code'和'Tag'? – Sotos

回答

4

这里的另一种方法 - 它不依赖于dfOrig列被责令1,2,3,1,2,3等

x <- c("ID", "Code", "Tag") # new column names 
n <- length(x)     # number of columns 
res <- data.frame(lapply(split(as.character(dfOrig$Value), rep(x, nrow(dfOrig)/n)), 
     type.convert)) 

得到的数据是:

> str(res) 
#'data.frame': 2 obs. of 3 variables: 
# $ Code: Factor w/ 2 levels "B","C": 2 1 
# $ ID : int 1 3 
# $ Tag : int 531404 477644 

由于你可以看到,列类已被转换。如果您希望Code列为character而不是factor,则可以在data.frame调用中指定stringsAsFactors = FALSE

它看起来是这样的:

> res 
# Code ID Tag 
#1 C 1 531404 
#2 B 3 477644 

注意:您有条目的dfOrig$Value对订单列名顺序x一致。

如果你想在x规定获得的res列的顺序,你可以使用以下命令:

res <- res[, match(x, names(res))] 
+0

优秀,有没有办法在同一时间添加列标题(ID,代码,标签)? – matekus

+0

使用colnames(df)< - c(“ID”,“Code”,“Tag”) – cccmir

+0

@matekus,更新我的文章 –

1

也许转换与nrow到矩阵:

# set number of columns 
myNcol <- 3 

# convert to matrix, then dataframe 
res <- data.frame(matrix(dfOrig$Value, ncol = myNcol, byrow = TRUE), 
        stringsAsFactors = FALSE) 

# convert the type and add column names 
res <- as.data.frame(lapply(res, type.convert), 
        col.names = c("resID", "Code", "Tag")) 
res 
# resID Code Tag 
# 1  1 C 531404 
# 2  3 B 477644 
+0

@docendodiscimus好点,在'post.convert'中增加另一个步骤希望它对你来说是非常不同的方法,因为我正在使用矩阵。 – zx8754

+1

您也可以使用'byrow = TRUE',即'矩阵(dfOrig $ Value,ncol = myNcol,byrow = TRUE)' – akrun

+1

@akrun谢谢,我会更新,这将删除额外的步骤。 – zx8754

0

您可以创建一个seq编号

x <- seq(1:nrow(dfOrig)) %% 3 #you can change this 3 to number of columns you need 

data.frame(ID = dfOrig$Value[x == 1], 
      Code = dfOrig$Value[x == 2], 
      Tag = dfOrig$Value[x == 0]) 


#ID Code Tag 
#1 1 C 531404 
#2 3 B 477644 

另一种方法是split婷数据帧根据使用do.call

x <- seq(1:nrow(dfOrig))%%3 
res <- do.call("cbind", split(dfOrig,x)) 

你绝对可以更改列名称上面再结合列生成的序列

colnames(res) <- c("Tag", "Id", "Code") 

# Tag  Id Code 
#3 531404  1  C 
#6 477644  3  B 
+1

尝试做100列。 – zx8754

+0

我希望第二个解决方案能够解决这个问题。 –

相关问题