将特定行重新整形为R中的列

时间:2016-08-31 19:52:13

标签: r reshape reshape2

我的示例数据框如下所示:

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   

由于

2 个答案:

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

所以,它全部在数据框的一行中,所有变量名都在数据框中正确显示。

这一策略的好处是:

  • 它可用于启动CSV文件,其中变量的数量不是4的倍数。
  • 它可用于启动包含任意行数的CSV文件
  • 使用unlist()或as.character()不会发生奇怪的动态转换。

答案 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(.)