簡體   English   中英

在R中重新排列數據

[英]Rearranging data in R

我有一個這樣排列的大數據集

Stat.num   LatS.dec.NEW LonS.dec.NEW    LatF.dec.NEW   LonF.dec.NEW 
388        66.68         -21.0666      66.7071666       -20.98  
389        66.69         -21.01        66.6433         -21.06

但我想這樣重新安排

Stat.numb order  Lat              Lon
388       1     66.68           -21.06666
388       2     66.7071         -20.98  
389       1     66.6            -21.01  
389       2     66.643          -21.06  

我一直在嘗試使用dplyr解決此問題,但是我還沒有找到解決方案,非常感謝您的幫助。

預先感謝

要使用從長重新排列數據集寬幅tidyverse ,您可以使用tidyr包功能spreadgather

# just for a reproductible df

df <-
  structure(
    list(
      Stat.num = 388:389,
      LatS.dec.NEW = c(66.68, 66.69),
      LonS.dec.NEW = c(-21.0666,-21.01),
      LatF.dec.NEW = c(66.7071666,
                       66.6433),
      LonF.dec.NEW = c(-20.98,-21.06)
    ),
    .Names = c(
      "Stat.num",
      "LatS.dec.NEW",
      "LonS.dec.NEW",
      "LatF.dec.NEW",
      "LonF.dec.NEW"
    ),
    row.names = c(NA,-2L),
    class = "data.frame"
  )

df
#>   Stat.num LatS.dec.NEW LonS.dec.NEW LatF.dec.NEW LonF.dec.NEW
#> 1      388        66.68     -21.0666     66.70717       -20.98
#> 2      389        66.69     -21.0100     66.64330       -21.06

library(tidyr)
library(dplyr)
#> 
#> Attachement du package : 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
df %>%
  gather("type", "value", -Stat.num) %>%
  separate(type, c("type", "order", "drop"), sep = c(3, 4)) %>%
  select(-drop) %>%
  spread(type, value)
#>   Stat.num order      Lat      Lon
#> 1      388     F 66.70717 -20.9800
#> 2      388     S 66.68000 -21.0666
#> 3      389     F 66.64330 -21.0600
#> 4      389     S 66.69000 -21.0100

一班輪:

> data
  Stat.num LatS.dec.NEW LonS.dec.NEW LatF.dec.NEW LonF.dec.NEW
1      388        66.68     -21.0666     66.70717       -20.98
2      389        66.69     -21.0100     66.64330       -21.06

然后做:

> nr = nrow(data)
> setNames(data.frame(rep(data$Stat.num,rep(2,nr)),rep(1:2,nr),matrix(t(data[,-1]),ncol=2,byrow=TRUE)),c("Stat.num","order","Lat","Long"))
  Stat.num order      Lat     Long
1      388     1 66.68000 -21.0666
2      388     2 66.70717 -20.9800
3      389     1 66.69000 -21.0100
4      389     2 66.64330 -21.0600

這對於您的“大”數據是否有效取決於其大小。

它的工作方式是將最后四列重新排列為兩列矩陣,然后通過各種重復和序列為新數據幀構造適當的向量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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