R 使用if语句在数据帧的行上循环应用函数
我是R新手,我尝试对给定数据帧的两列求和,如果要求和的两个元素都满足给定条件。为了说明问题,我想做的是: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
> 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.difelse
这里是你的朋友:
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