簡體   English   中英

將特定的行重整為R中的列

[英]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

因此,它們全都位於數據幀的一行中,並且所有變量名都正確顯示在數據幀中。

此策略的好處是:

  • 它適用於啟動CSV文件(變量數量不是4的倍數)的情況。
  • 它適用於啟動具有任意行數的CSV文件
  • unlist()或as.character()不會發生奇怪的動態轉換。

創建一個大致看起來像這樣的數據框(盡管它必須具有列名)。 如果您僅使用標准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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM