R 使用if语句在数据帧的行上循环应用函数

R 使用if语句在数据帧的行上循环应用函数,r,loops,if-statement,dataframe,apply,R,Loops,If Statement,Dataframe,Apply,我是R新手,我尝试对给定数据帧的两列求和,如果要求和的两个元素都满足给定条件。为了说明问题,我想做的是: > t.d<-as.data.frame(matrix(1:9,ncol=3)) > t.d V1 V2 V3 1 4 7 2 5 8 3 6 9 > t.d$V4<-rep(0,nrow(t.d)) > for (i in 1:nrow(t.d)){ + if (t.d$V1[i]>1 &&a

我是R新手,我尝试对给定数据帧的两列求和,如果要求和的两个元素都满足给定条件。为了说明问题,我想做的是:

> t.d<-as.data.frame(matrix(1:9,ncol=3))
> t.d
  V1 V2 V3
  1  4  7  
  2  5  8  
  3  6  9  

> t.d$V4<-rep(0,nrow(t.d))

> for (i in 1:nrow(t.d)){
+   if (t.d$V1[i]>1 && t.d$V3[i]<9){
+     t.d$V4[i]<-t.d$V1[i]+t.d$V3[i]}
+     }

> t.d    
  V1 V2 V3 V4
  1  4  7  0
  2  5  8 10
  3  6  9  0
>t.d t.d
V1 V2 V3
1  4  7  
2  5  8  
3  6  9  
>t.d$V4用于(i/1:nrow(t.d)){
+如果(t.d$V1[i]>1和&t.d$V3[i]9]
“应用”是选项吗?我尝试了以下方法:

t.d<-as.data.frame(matrix(1:9,ncol=3))
t.d$V4<-rep(0,nrow(t.d))

my.fun<-function(x,y){
  if(x>1 && y<9){
    x+y}
}

t.d$V4<-apply(X=t.d,MAR=1,FUN=my.fun,x=t.d$V1,y=t.d$V3)

t.d此操作不需要循环、应用语句或if语句。矢量化操作和子集设置就是您所需要的:

t.d <- within(t.d, V4 <- V1 + V3)
t.d[!(t.d$V1>1 & t.d$V3<9), "V4"] <- 0
t.d

  V1 V2 V3 V4
1  1  4  7  0
2  2  5  8 10
3  3  6  9  0

t.d
ifelse
这里是你的朋友:

t.d$V4<-ifelse((t.d$V1>1)&(t.d$V3<9), t.d$V1+ t.d$V3, 0)

t.d$V41)和(t.d$V3我将插入并提供另一个版本。由于如果条件不符合马赫数,您希望为零,而TRUE/FALSE是1/0的美化版本,只需乘以条件即可:

t.d<-as.data.frame(matrix(1:9,ncol=3))
t.d <- within(t.d, V4 <- (V1+V3)*(V1>1 & V3<9))

t.d+1,感谢您在创建示例数据和您自己的代码尝试方面所做的努力。欢迎来到SO。这是一个很好的问题示例。谢谢您!如此简单但又完美。我不敢相信我花了半天时间思考这个问题。如果这能让您感觉更好的话,那么当我开始与R合作时,这种类型的问题让我的头脑变得迟钝。:-)
t.d<-as.data.frame(matrix(1:9,ncol=3))
t.d <- within(t.d, V4 <- (V1+V3)*(V1>1 & V3<9))
t.d <- data.frame(V1=runif(2e7, 1, 2), V2=1:2e7, V3=runif(2e7, 5, 10))
system.time( within(t.d, V4 <- (V1+V3)*(V1>1 & V3<9)) )         # 3.06 seconds
system.time( ifelse((t.d$V1>1)&(t.d$V3<9), t.d$V1+ t.d$V3, 0) ) # 5.08 seconds
system.time( { t.d <- within(t.d, V4 <- V1 + V3); 
               t.d[!(t.d$V1>1 & t.d$V3<9), "V4"] <- 0 } )       # 4.50 seconds