lapply和多个条件参数(ifelse与if else系列)

时间:2017-07-01 02:26:35

标签: r controls lapply

我有一个数据框列表:

count1<-(seq(1:10)) 
count2<-(seq(5:14))    
other<-c("a","b","c","d","e","f","g","h","i","j")
a<-seq(1,20,by=2)
b<-seq(1,30,by=3)
c<-seq(1,40,by=4)

df1<-data.frame(cbind(a,other,count1))
df2<-data.frame(cbind(b,other,count1))
df3<-data.frame(cbind(c,other,count2))

sept<-list(df1,df2,df3)

我想在每个数据帧中创建一个额外的变量,其值以count1 / count2的值为条件。有了lapply,ifelse适用于两个条件:

sept2<-lapply(sept,function(x) {
     mx<-max(x[[3]]);
     d3<-(mx-2);
     ifelse (d3 < x[[3]], x[[4]] <-4, x[[4]] <-0);
 })

this2
[[1]]
 [1] 0 0 0 0 0 0 0 0 4 4

[[2]]
 [1] 0 0 0 0 0 0 0 0 4 4

[[3]]
 [1] 0 0 0 0 0 0 0 0 4 4

然而,使用与if else系列相同的基本结构并不起作用。

this3<-lapply(this,function(x) {
    mx<-max(x[[3]]);
    d3<-(mx-2);
    d2<-(mx-4);
    d1<-(mx-6);
    if (d3<x[[3]] && x[[3]]<=mx) {
        x[[4]] <-4
    } else if (d2<x[[3]] && x[[3]]<=d3){
        x[[4]] <-3
        } else if (d1<x[[3]] && x[[3]]<=d2){
            x[[4]] <-2
        }else {
            x[[4]] <-1
        }
})

this3

[[1]]
[1] 1

[[2]]
[1] 1

[[3]]
[1] 1

我不明白为什么R知道在使用ifelse时将函数应用于x [[3]]的每次观察,但在使用if else系列时则不然。为什么这两种情况不同?

1 个答案:

答案 0 :(得分:0)

我认为,当你写if(cond) {do1} else {do2}时,只评估cond中的第一个元素。例如,如果cond[1] == TRUE,则执行do_1,如果do2 FALSE,则执行condifelse的剩余元素被忽略。

这不是ifelse (cond, do1, do2)的行为,正如您在第一个例子中注意到的那样。在do1中,do2cond中的相关部分将根据TRUE FALSEthis <- sept this3 <-lapply(this, function(x) { mx <- max(x[[3]]); d3 <- mx-2 d2 <- mx-4 d1 <- mx-6 x[[4]] <- rep(1, length(x[[3]])) x[[4]][d3<x[[3]] & x[[3]]<=mx] <- 4 x[[4]][d2<x[[3]] & x[[3]]<=d3] <- 3 x[[4]][d1<x[[3]] & x[[3]]<=d2] <- 2 x[[4]] }) 的哪些元素完成。

以下代码应该做你想做的事情

InputMethodManager inputMethodManager = (InputMethodManager) 
           getSystemService(Activity.INPUT_METHOD_SERVICE);     
           inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(‌​), 0);