[英]Reshape specific rows into columns in R
我的樣本數據框架如下所示:
1 Number Type Code Reason
2 0123 06 09 010
3 Date Amount Damage Act
4 08/31/16 10,000 Y N
5 State City Zip Phone
6 WI GB 1234 Y
我要制作第1、3和5行的列名,並將每個下面的數據分別歸入每一列。 我一直在研究reshape
函數,但僅看到示例,其中整個值列需要是單個列。 所以我不確定在這種情況下該怎么做-很明顯,很抱歉。
這是所需的輸出:
1 Number Type Code Reason Date Amount Damage Act State City Zip Phone
2 0123 06 09 010 08/31/16 10,000 Y N WI GB 1234 Y
謝謝
正如某些人所評論的那樣,您可以在起始數據框的行中構建一個數據框,但是我認為處理文本行要容易一些。
如果您的起始文件看起來像這樣
Number , Type , Code ,Reason
0123 , 06 , 09 , 010
Date , Amount , Damage , Act
08/31/16 , 10000 , Y , N
State , City , Zip , Phone
WI , GB , 1234, Y
我們可以將每一行作為字符向量的元素讀入:
lines <- readLines("start.csv")
將所有奇數行合並為一行:
oddind <- seq(from=1, to= length(lines), by=2)
namelines <- paste(lines[oddind], collapse=",")
將所有偶數行合並為一行:
datlines <- paste(lines[oddind+1], collapse=",")
將這些行轉換為新的CSV以便閱讀:
writeLines(text= c(namelines, datlines), con= "nice.csv")
print(read.csv("nice.csv"))
這給
Number Type Code Reason Date Amount Damage Act State
1 123 6 9 10 08/31/16 10000 Y N WI
City Zip Phone
1 GB 1234 Y
因此,它們全都位於數據幀的一行中,並且所有變量名都正確顯示在數據幀中。
此策略的好處是:
創建一個大致看起來像這樣的數據框(盡管它必須具有列名)。 如果您僅使用標准read.*
函數之一而不使用stringsAsFactors=FALSE
,那么這些可能是因子列,因此需要使用stringsAsFactors=FALSE
進行轉換。
dat=read.table(text="1 Number Type Code Reason
2 0123 06 09 010
3 Date Amount Damage Act
4 08/31/16 10,000 Y N
5 State City Zip Phone
6 WI GB 1234 Y")
然后,您可以使用以下命令將奇數行設置為偶數行的值-向量的名稱:
setNames( unlist( lapply( dat[!c(TRUE,FALSE), ] ,as.character)),
unlist( lapply( dat[c(TRUE,FALSE), ] ,as.character)) )
1 3 5 Number Date State Type
"2" "4" "6" "0123" "08/31/16" "WI" "06"
Amount City Code Damage Zip Reason Act
"10,000" "GB" "09" "Y" "1234" "010" "N"
Phone
"Y"
下一個提取操作中的!c(TRUE,FALSE)
及其邏輯補碼會沿所有可能的行神奇地回收。 顯然,如果發布文本文件的版本而不是說起點是數據框,則將有更好的方法。 您將需要刪除可能的行名。 如果您想使用“干凈的解決方案”,請從您的數據dput(.)
或原始文本文件中發布dput(.)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.