ifelse:将条件从1列分配给另一列和多个语句

时间:2012-11-27 20:01:13

标签: r

我有一个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应该是哪个?

4 个答案:

答案 0 :(得分:4)

请勿在{{1​​}}功能中进行分配。

ifelse

答案 1 :(得分: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?",答案就在于您为ifelse(.)声明的if-TRUE部分分配的内容。

你的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"的值,但强制转换为整数。即:0表示FALSE,1表示TRUE


您还可以利用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)

答案 2 :(得分: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

答案 3 :(得分: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