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?"答案,则取决于您为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)
于 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 回答