0

私はdata.frameを持っています。列 2、3、4 の値を使用して、col1 に値を割り当てようとしています。これは可能ですか?

dat<-data.frame(col1=c(1,2,3,4,5), col2=c(1,2,3,4,"U"), col3=c(1,2,3,"U",5), col4=c("U",2,3,4,5))
dat1=data.frame(col1=ifelse(dat$col2=="U"|dat$col3=="U"|dat$col4=="U", dat$col1=="U", dat$col1))

col1
0
2
3
0
0

U があるはずの場所に 0 が表示されるのはなぜですか?

4

4 に答える 4

3

関数内で代入しないでくださいifelse

dat1=data.frame(col1=ifelse(dat$col2=="U"|dat$col3=="U"|dat$col4=="U", 
                "U", 
                dat$col1))
dat1
  col1
1    U
2    2
3    3
4    U
5    U
于 2012-11-27T20:04:59.483 に答える
1

おそらくこれを使用したいでしょう:

    dat1 <- data.frame(col1=ifelse(dat$col2=="U"|dat$col3=="U"|dat$col4=="U", "U", dat$col1))
    # I changed the dat$col1=="U"  to just  "U"


質問が答えである場合、ステートメント"Why am I getting a 0 where a U should be?"の if-TRUE 部分に割り当てたものに答えがあります。ifelse(.)

あなたの ifelse ステートメントは本質的に言う

 if any of columns 2 through 4 are U
 then assign the value of `does column 1 == "U"`   <-- Not sure if this is what you want
 else assign the value of column 1

したがって、 ifelse テストが に評価されるとTRUE、返されるのは の値ですがcol1=="U"、整数に強制されます。例: FALSE の場合は 0、TRUE の場合は 1


T/F が 1/0 に評価されることを利用して、コードをクリーンアップすることもできます。

 # using the fact that rowSums(dat[2:4]=="U") will be 0 when "U" is not in any column:
 ifelse(rowSums(dat[2:4]=="U")>0, "U", dat$col1)
于 2012-11-27T20:37:09.700 に答える
0

any()このようなものをよりきれいにします

head(dat)
  col1 col2 col3 col4
1    1    1    1    U
2    2    2    2    2
3    3    3    3    3
4    4    4    U    4
5    5    U    5    5

apply(dat,1, function(x)any(x=='U'))
[1]  TRUE FALSE FALSE  TRUE  TRUE
dat[apply(dat,1, function(x)any(x=='U')), 1] <-'U'

dat
  col1 col2 col3 col4
1    U    1    1    U
2    2    2    2    2
3    3    3    3    3
4    U    4    U    4
5    U    U    5    5
于 2012-11-27T20:21:28.490 に答える
0

簡単な方法は次のとおりです。

dat$col1[as.logical(rowSums(dat[-1]=="U"))] <- "U"


  col1 col2 col3 col4
1    U    1    1    U
2    2    2    2    2
3    3    3    3    3
4    U    4    U    4
5    U    U    5    5
于 2012-11-27T20:37:06.957 に答える