我的示例数据框如下所示:
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
由于
答案 0 :(得分:1)
正如有些人评论过的那样,您可以从起始数据框的行中构建数据框,但我认为在文本行上工作会更容易。
如果您的起始文件看起来像这样
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
所以,它全部在数据框的一行中,所有变量名都在数据框中正确显示。
这一策略的好处是:
答案 1 :(得分:1)
创建一个大致类似的数据框(虽然它必然有列名)。如果您只使用其中一个标准read.*
函数而不使用stringsAsFactors=FALSE
,那么这些可能是因子列,因此需要使用as.character进行转换。
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)
及其逻辑补码会在所有可能的行中被神奇地回收。显然,如果您发布了一个文本文件的版本而不是说起点是数据帧,那么会有更好的方法。您需要删除可能是rownames的内容。如果您想要一个干净的解决方案,请从您的数据框或原始文本文件发布dput(.)
。