【问题标题】:Reshape specific rows into columns in R将特定行重塑为 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,])))

标签: r reshape reshape2


【解决方案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(.)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-16
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多