3

私は R を初めて使用し、データの書式設定に関する質問があります。これを変換する必要があります:

Poly Tran Strat Surv MALLP MALLS MALLG MALLF GADWP GADWS GADWG GADWF
AL    1    M      y     1    2    0      0     1     4     0     0
ARL   1    M      y     0    0    0      0     0     0     20    0
AM    1    M      y     0    0    0      0     0     0     0     0
AM    2    M      y     1    0    0      0     0     0     0     5

これに:

Poly Tran Strat Surv  Spp   Num   Status
AL    1    M      y   mall   1      p
AL    1    M      y   mall   2      s
AL    1    M      y   gadw   1      p
AL    1    M      y   gadw   4      s
ARL   1    M      y   gadw   20     g
AM    2    M      y   mall   1      p
AM    2    M      y   gadw   5      f

助けが必要です!
ありがとうございました。

4

4 に答える 4

3

を使用するdplyrと、次のtidyrことができます。

library(tidyr)
library(dplyr)

df %>% gather(Spp, Num, -Poly, -Tran, -Strat, -Surv) %>%
  mutate(Status = tolower(substr(Spp, 5, 5)),
         Spp = tolower(substr(Spp, 1, 4))) %>%
  filter(!Num == 0) %>%
  arrange(Tran)

これにより、次のことが得られます。

#  Poly Tran Strat Surv  Spp Num Status
#1   AL    1     M    y mall   1      p
#2   AL    1     M    y mall   2      s
#3   AL    1     M    y gadw   1      p
#4   AL    1     M    y gadw   4      s
#5  ARL    1     M    y gadw  20      g
#6   AM    2     M    y mall   1      p
#7   AM    2     M    y gadw   5      f
于 2015-03-23T23:51:22.720 に答える
2

楽しみのために、これがベース R アプローチです。「0」を に置き換えたNAので、値na.omitを入力した後にデータセットを「縮小」するために使用できstackます。gsubそこから、"spp" と "status" の値を取得するのは少し基本的なことです。

within(na.omit(
  cbind(dat[1:4], 
        stack(replace(dat[-c(1:4)], dat[-c(1:4)] == 0, NA)))), {
          ind <- tolower(ind)
          spp <- gsub("(mall|gadw).*", "\\1", ind)
          status <- gsub("mall|gadw", "", ind)
          rm(ind)
        })
#    Poly Tran Strat Surv values status  spp
# 1    AL    1     M    y      1      p mall
# 4    AM    2     M    y      1      p mall
# 5    AL    1     M    y      2      s mall
# 17   AL    1     M    y      1      p gadw
# 21   AL    1     M    y      4      s gadw
# 26  ARL    1     M    y     20      g gadw
# 32   AM    2     M    y      5      f gadw

ドミニクとスティーブンの回答で示されているように、注文は非常に簡単です。

于 2015-03-24T07:31:35.483 に答える
2

ベースRを使用したソリューション(を除くreshape2::melt):

dat2 <- reshape2::melt(dat, id.vars=c("Poly","Tran","Strat","Surv"))
dat2 <- subset(dat2, subset = value > 0)
dat2$variable <- as.character(dat2$variable)
dat2$Status <- with(dat2, substr(tolower(variable), nchar(variable), nchar(variable)))
dat2$variable <- with(dat2, substr(tolower(variable), 1, nchar(variable)-1))
dat2 <- dat2[order(dat2$Tran),]
colnames(dat2) <- c("Poly", "Tran", "Strat", "Surv", "Spp", "Num", "Status")
rownames(dat2) <- NULL

結果

> dat2

  Poly Tran Strat Surv  Spp Num Status
1   AL    1     M    y mall   1      p
2   AL    1     M    y mall   2      s
3   AL    1     M    y gadw   1      p
4   AL    1     M    y gadw   4      s
5  ARL    1     M    y gadw  20      g
6   AM    2     M    y mall   1      p
7   AM    2     M    y gadw   5      f

データ

dat <- read.csv(text = "Poly,Tran,Strat,Surv,MALLP,MALLS,MALLG,MALLF,GADWP,GADWS,GADWG,GADWF
AL,1,M,y,1,2,0,0,1,4,0,0
ARL,1,M,y,0,0,0,0,0,0,20,0
AM,1,M,y,0,0,0,0,0,0,0,0
AM,2,M,y,1,0,0,0,0,0,0,5")
于 2015-03-23T23:51:36.877 に答える
0

ここで使用していdata.tableます:

dt.m = melt(dt, id=1:4, variable.name="Spp", value.name="Num")[Num != 0L]
dt.m[, c("Spp", "Status") := list(substring(Spp, 1, 4), substring(Spp, 5, 5))]

または、次を使用しread.fwfます。

dt.m = melt(dt, id=1:4, variable.name="Spp", value.name="Num", variable.factor = FALSE)
dt.m[Num != 0L][, c("Spp", "Status") := read.fwf(textConnection(Spp), widths=c(4,1))]
于 2015-03-25T12:43:25.373 に答える