将单列数据帧转换为具有多行和命名列的数据帧

时间:2016-09-13 08:00:59

标签: r dataframe

dfOrig <- data.frame(rbind("1",
                       "C",
                       "531404",
                       "3",
                       "B",
                       "477644"))
setnames(dfOrig, "Value")

我有一个列向量,实际上包含两个三个变量的观察值。如何将其转换为具有以下结构的data.frame:

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

显然,这只是一个玩具示例,用于说明更多观察和变量的现实问题。

3 个答案:

答案 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