0

時間の列があり、それを新しい列にグループ化する必要があります。

structure(list(Q11aWalkHoursEdit.SS = c(0, 1, 2, 3, 4, 5, 6, 
6, 7, 2.5, 6, 1.9, 0.5)), 
.Names = "Q11aWalkHoursEdit.SS", 
class = "data.frame", 
row.names = c(NA, -13L))

最初は、次のように if を使用すると考えていました。

grouphours <- function(data){
  data$Q11aWalkHours.SS <- NA
  if(data["Q11aWalkHoursEdit.SS"] >= 5){
    data["Q11aWalkHours.SS"] = "5 hours +"
  } else if(data["Q11aWalkHoursEdit.SS"] > 4){
    data["Q11aWalkHours.SS"] = "4-5 hours"
  } else if(data["Q11aWalkHoursEdit.SS"] > 3){
    data["Q11aWalkHours.SS"] = "3-4 hours"
  } else if(data["Q11aWalkHoursEdit.SS"] > 2){
    data["Q11aWalkHours.SS"] = "2-3 hours"
  } else if(data["Q11aWalkHoursEdit.SS"] > 1){
    data["Q11aWalkHours.SS"] = "1-2 hours"
  } else if(data["Q11aWalkHoursEdit.SS"] > 0){
    data["Q11aWalkHours.SS"] = "0-1 hours"
  } else if(data["Q11aWalkHoursEdit.SS"] == 0){
    data["Q11aWalkHours.SS"] = "0 hours"
  } else {
    data["Q11aWalkHours.SS"] = NA
  }
  return(data)    
}
test <- grouphours(stuff)

しかし、 if はベクトルでは機能しないため、これは機能しません。次のエラーが発生します。

1: In if (data["Q11aWalkHoursEdit.SS"] >= 5) { ... :
  the condition has length > 1 and only the first element will be used

次に for ループを書き始めましたが、これも機能しません。理由がよくわかりません。

grouphours <- function(data){
  data$Q11aWalkHours.SS <- NA
  l<-length(stuff$Q11aWalkHoursEdit.SS)
  for(i in 1:l){
  if(data["Q11aWalkHoursEdit.SS"] >= 5){
    data["Q11aWalkHours.SS"] = "5 hours +"
  } else if(data["Q11aWalkHoursEdit.SS"] > 4){
    data["Q11aWalkHours.SS"] = "4-5 hours"
  } else if(data["Q11aWalkHoursEdit.SS"] > 3){
    data["Q11aWalkHours.SS"] = "3-4 hours"
  } else if(data["Q11aWalkHoursEdit.SS"] > 2){
    data["Q11aWalkHours.SS"] = "2-3 hours"
  } else if(data["Q11aWalkHoursEdit.SS"] > 1){
    data["Q11aWalkHours.SS"] = "1-2 hours"
  } else if(data["Q11aWalkHoursEdit.SS"] > 0){
    data["Q11aWalkHours.SS"] = "0-1 hours"
  } else if(data["Q11aWalkHoursEdit.SS"] == 0){
    data["Q11aWalkHours.SS"] = "0 hours"
  } else {
    data["Q11aWalkHours.SS"] = NA
  }
  }
  return(data)    
}
test <- grouphours(stuff)

とにかく、ループを使用する必要はないように感じます-この質問のコメントに基づいて: 警告「条件の長さは> 1で、最初の要素のみが使用されます」 しかし、それらを適用する方法を理解するのに問題があります私の状況への反応。

編集:

みんな助けてくれてありがとう。次のコードを使用して、完全に機能させました。「より良い」解決策になると思いますcutが、まだ理解していないので、今のところ ifelse を使用します。

stuff$test <- ifelse(stuff$Q11aWalkHoursEdit.SS>=5, "Five +", 
              ifelse (stuff$Q11aWalkHoursEdit.SS>=4, "Four to five", 
                      ifelse (stuff$Q11aWalkHoursEdit.SS>=3, "Three to four", 
                              ifelse (stuff$Q11aWalkHoursEdit.SS>=2, "Two to three", 
                                      ifelse (stuff$Q11aWalkHoursEdit.SS>=1, "One to two", 
                                              ifelse(stuff$Q11aWalkHoursEdit.SS>0, "0 to one", "Zero")
                                      )
                              )
                      )
              )
)
4

2 に答える 2

3

使用cut:

DF$interval <- cut(DF[,1], breaks=c(-Inf, 0:5,Inf))

唯一の問題は>= 5、手動で修正する必要がある状態です。

DF$interval[DF[,1]==5] <- "(5, Inf]"
levels(DF$interval)[6:7] <- c("(4,5)","[5, Inf]")

   Q11aWalkHoursEdit.SS interval
1                   0.0 (-Inf,0]
2                   1.0    (0,1]
3                   2.0    (1,2]
4                   3.0    (2,3]
5                   4.0    (3,4]
6                   5.0 [5, Inf]
7                   6.0 [5, Inf]
8                   6.0 [5, Inf]
9                   7.0 [5, Inf]
10                  2.5    (2,3]
11                  6.0 [5, Inf]
12                  1.9    (1,2]
13                  0.5    (0,1]
于 2013-10-04T13:42:59.627 に答える
0

範囲を試しceilingてから更新することもできますが、「5」を配置する間隔はわかりません...

x <- data.frame( hrs = c(0, 1, 2, 3, 4, 5, 6, 6, 7, 2.5, 6, 1.9, 0.5))
x$y <- ceiling(x$hrs)
x$y[x$y>6] <- 6
x$y <- ifelse( x$y==0, "0 hours", paste(x$y-1, "-", x$y, " hours", sep="") )
x$y[x$y=="5-6 hours"] <- "5 hours+"
x

   hrs         y
1  0.0   0 hours
2  1.0 0-1 hours
3  2.0 1-2 hours
4  3.0 2-3 hours
5  4.0 3-4 hours
6  5.0 4-5 hours
7  6.0  5 hours+
8  6.0  5 hours+
9  7.0  5 hours+
10 2.5 2-3 hours
11 6.0  5 hours+
12 1.9 1-2 hours
13 0.5 0-1 hours
于 2013-10-04T15:32:03.240 に答える