3

次のデータセットがあるとします。

 transect <- c("B","N","C","D","H","J","E","L","I","I")
 sampler <- c(rep("J",5),rep("W",5))
 species <- c("ROB","HAW","HAW","ROB","PIG","HAW","PIG","PIG","HAW","HAW")
 weight <- c(2.80,52.00,56.00,2.80,16.00,55.00,16.20,18.30,52.50,57.00)
 wingspan <- c(13.9, 52.0, 57.0, 13.7, 11.0,52.5, 10.7, 11.1, 52.3, 55.1)
 week <- c(1,2,3,4,5,6,7,8,9,9)
 # Warning to R newbs: Really bad idea to use this code
 ex <- as.data.frame(cbind(transect,sampler,species,weight,wingspan,week))

私が達成しようとしているのは、種とそれに関連する重量と翼幅に関する情報を転置することです。予想される結果のより良いアイデアについては、以下を参照してください。私のデータ セットは約 50 万行の長さで、約 200 の異なる種があるため、非常に大きなデータフレームになります。

      transect sampler week ROBweight HAWweight PIGweight ROBwingspan HAWwingspan PIGwingspan
1         B       J    1       2.8       0.0       0.0        13.9         0.0         0.0
2         N       J    2       0.0      52.0       0.0         0.0        52.0         0.0
3         C       J    3       0.0      56.0       0.0         0.0        57.0         0.0
4         D       J    4       2.8       0.0       0.0        13.7         0.0         0.0
5         H       J    5       0.0       0.0      16.0         0.0         0.0        11.0
6         J       W    6       0.0      55.0       0.0         0.0        52.5         0.0
7         E       W    7       0.0       0.0      16.2         0.0         0.0        10.7
8         L       W    8       0.0       0.0      18.3         0.0         0.0        11.1
9         I       W    9       0.0      52.5       0.0         0.0        52.3         0.0
10        I       W    9       0.0      57.0       0.0         0.0        55.1         0.0
4

1 に答える 1

3

主な問題は、現在、一意の「id」変数がないことです。これにより、 と の通常の容疑者に問題が発生しreshapeますdcast

これが解決策です。「splitstackshape」パッケージから使用しましgetanIDたが、さまざまな方法を使用して独自の一意の ID 変数を作成するのは非常に簡単です。

library(splitstackshape)
library(reshape2)
idvars <- c("transect", "sampler", "week")
ex <- getanID(ex, id.vars=idvars)

ここから、次の 2 つのオプションがあります。

reshapeベースRから:

reshape(ex, direction = "wide", 
        idvar=c("transect", "sampler", "week", ".id"), 
        timevar="species")

meltそしてdcast「reshape2」から

まず、meltデータを「長い」形式にします。

exL <- melt(ex, id.vars=c(idvars, ".id", "species"))

次に、castデータを広い形式に変換します。

dcast(exL, transect + sampler + week + .id ~ species + variable)
#    transect sampler week .id HAW_weight HAW_wingspan PIG_weight PIG_wingspan ROB_weight ROB_wingspan
# 1         B       J    1   1         NA           NA         NA           NA        2.8         13.9
# 2         C       J    3   1       56.0         57.0         NA           NA         NA           NA
# 3         D       J    4   1         NA           NA         NA           NA        2.8         13.7
# 4         E       W    7   1         NA           NA       16.2         10.7         NA           NA
# 5         H       J    5   1         NA           NA       16.0         11.0         NA           NA
# 6         I       W    9   1       52.5         52.3         NA           NA         NA           NA
# 7         I       W    9   2       57.0         55.1         NA           NA         NA           NA
# 8         J       W    6   1       55.0         52.5         NA           NA         NA           NA
# 9         L       W    8   1         NA           NA       18.3         11.1         NA           NA
# 10        N       J    2   1       52.0         52.0         NA           NA         NA           NA

より良いオプション: "data.table"

別の方法 (そしておそらく望ましい) として、次のように "data.table" パッケージ (少なくともバージョン 1.8.11) を使用できます。

library(data.table)
library(reshape2) ## Also required here
packageVersion("data.table")
# [1] ‘1.8.11’
DT <- data.table(ex)
DT[, .id := sequence(.N), by = c("transect", "sampler", "week")]
DTL <- melt(DT, measure.vars=c("weight", "wingspan"))
dcast.data.table(DTL, transect + sampler + week + .id ~ species + variable)
#     transect sampler week .id HAW_weight HAW_wingspan PIG_weight PIG_wingspan ROB_weight ROB_wingspan
#  1:        B       J    1   1         NA           NA         NA           NA        2.8         13.9
#  2:        C       J    3   1       56.0         57.0         NA           NA         NA           NA
#  3:        D       J    4   1         NA           NA         NA           NA        2.8         13.7
#  4:        E       W    7   1         NA           NA       16.2         10.7         NA           NA
#  5:        H       J    5   1         NA           NA       16.0         11.0         NA           NA
#  6:        I       W    9   1       52.5         52.3         NA           NA         NA           NA
#  7:        I       W    9   2       57.0         55.1         NA           NA         NA           NA
#  8:        J       W    6   1       55.0         52.5         NA           NA         NA           NA
#  9:        L       W    8   1         NA           NA       18.3         11.1         NA           NA
# 10:        N       J    2   1       52.0         52.0         NA           NA         NA           NA

fill = 0いずれかのバージョンに追加して、値を 0dcastに置き換えます。NA

于 2013-10-15T15:40:35.287 に答える