[英]Convert single column dataframe to dataframe with multiple rows and named columns
dfOrig <- data.frame(rbind("1",
"C",
"531404",
"3",
"B",
"477644"))
setnames(dfOrig, "Value")
我有一個單列向量,實際上包含三個變量的兩個觀察值。 如何將其轉換為具有以下結構的data.frame:
ID Code Tag
"1" "C" "531404"
"3" "B" "477644"
顯然,這只是一個玩具示例,它用更多的觀察值和變量來說明一個實際問題。
這是另一種方法-它確實依賴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
注意:您必須獲得x
中的列名順序,以與dfOrig$Value
條目的順序一致。
如果要獲得x
指定的res
的列順序,可以使用以下命令:
res <- res[, match(x, names(res))]
也許用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
您可以創建一個seq
號uence
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.