【问题标题】:replace the values using iflelse in R在 R 中使用 ifelse 替换值
【发布时间】:2013-03-15 18:10:47
【问题描述】:

我有一个非常琐碎的问题,数据如下:

sample<-list(c(10,12,17,7,9,10),c(NA,NA,NA,10,12,13),c(1,1,1,0,0,0))
sample<-as.data.frame(sample)
colnames(sample)<-c("x1","x2","D")

>sample
x1  x2  D
10  NA  1
12  NA  1
17  NA  1
7   10  0
9   20  0
10  13  0

注意:D=1 的观察次数与 D=0 相同

现在,我想创建一个变量x3,当D=1 时,它的值与D=0 相关,当D=0 时,它的值与D=1 相关。预期输出:

x1  x2  D   x3
10  NA  1   10
12  NA  1   20
17  NA  1   13
7   10  0   NA
9   20  0   NA
10  13  0   NA

我尝试使用ifelse函数如下:

sample.data$x3<-with(sample.data, ifelse(D==1,x2[which(D==0)],x2[which(D==1)]))

我收到以下错误:

logical(0)

我还尝试了以下方法:

sample.data$x3<-with(sample.data, ifelse(D==1,tail(x2,3),head(x2,3)))

我又遇到了同样的错误:

logical(0)

知道这里发生了什么吗?

【问题讨论】:

  • sample$x3 &lt;- sample$x2[order(sample$D)]
  • 感谢快捷解决方案。

标签: r if-statement multiple-columns


【解决方案1】:

你知道data.table,这里有一个解决方案...

install.packages("data.table")
library(data.table)

sample = as.data.table(sample)
sample[,x4:=ifelse(D==1,x2[D==0],x2[D==1])]

【讨论】:

  • @statquant:是的,我知道data.table,但没有用很多。感谢您的解决方案。
【解决方案2】:

您的命令中的逻辑是合理的,但是您错误地引用了数据框。您只需要在整个代码行中删除 sample 之后的 .data 即可。所以这个命令会给你你所需要的:

sample$x3<-with(sample,ifelse(D==1,x2[which(D==0)],x2[which(D==1)]))

不过,这段代码还是有点冗长。

如@arun在CMET中注意到,在选择x2 987654326 @时,您不需要包含哪个()函数。以下代码将为您提供相同的结果:

sample$x3<-with(sample,ifelse(D==1,x2[D==0],x2[D==1]))

【讨论】:

  • 当然。我还要注意,您正在以一种奇怪的方式创建该数据框——我会在一行中这样做:sample&lt;-data.frame(x1=c(10,12,17,7,9,10), x2=c(NA,NA,NA,10,20,13), D=c(1,1,1,0,0,0))。你可能想brush up on data frames a bit
  • (+1) 你不需要which,是吗?
  • @uptownnickbrown:感谢您的链接
  • 没问题。感谢@Arun 的注释,为了简洁起见,我添加了一条关于删除 which() 函数的注释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多