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 :(得分:4)
这是另一种方法 - 它依赖于订购1,2,3,1,2,3等dfOrig
列。
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
,则可以在stringsAsFactors = FALSE
来电中指定data.frame
。
它看起来像这样:
> res
# Code ID Tag
#1 C 1 531404
#2 B 3 477644
注意:您必须按照x
中条目的顺序获取dfOrig$Value
中的列名称顺序。
如果您希望获得res
中指定的x
的列顺序,则可以使用以下内容:
res <- res[, match(x, names(res))]
答案 1 :(得分: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
答案 2 :(得分: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