将特定行重塑为 R 中的列
Posted
技术标签:
【中文标题】将特定行重塑为 R 中的列【英文标题】:Reshape specific rows into columns in R 【发布时间】:2016-08-31 19:52:12 【问题描述】:我的示例数据框如下所示:
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
谢谢
【问题讨论】:
你能展示你想要的输出应该是什么样子吗? 嗨@USER_1,我更新了我的帖子以显示输出。 您的数据中只有 4 行? 实际上有 8 行 5 列的数据——所以我想将行设为 1、3、5 和 7 列。为简单起见,我只做了 4 行。这将从不同的网页重复 100 次。 如果你的数据太小,你可以做一些类似的事情:df2 <- cbind(df1[2,], df1[4,]); names(df2) <- as.character(unlist(c(df1[1,], df1[3,])))
【参考方案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
所以,它都在数据框中的一行中,并且所有变量名称都正确显示在数据框中。
这种策略的好处是:
它适用于启动变量数不是 4 的倍数的 CSV 文件。 它适用于启动任意行数的 CSV 文件 unlist() 或 as.character() 不会发生奇怪的动态转换。【讨论】:
【参考方案2】:创建一个大致看起来像这样的数据框(尽管它必须有列名)。如果您只使用标准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)
及其在下一个提取操作中的逻辑补码会沿着所有可能的行神奇地回收。显然,如果您发布文本文件的版本而不是说起点是数据框,那么会有更好的方法来做到这一点。您需要删除可能是行名的内容。如果您想要一个“干净的解决方案,请从您的数据框或原始文本文件中发布dput(.)
。
【讨论】:
以上是关于将特定行重塑为 R 中的列的主要内容,如果未能解决你的问题,请参考以下文章
R Shiny DataTable如何防止包含超链接的列中的行选择/取消选择