我有一个数据框列表:
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系列时则不然。为什么这两种情况不同?
答案 0 :(得分:0)
我认为,当你写if(cond) {do1} else {do2}
时,只评估cond
中的第一个元素。例如,如果cond[1] == TRUE
,则执行do_1
,如果do2
FALSE
,则执行cond
。 ifelse
的剩余元素被忽略。
这不是ifelse (cond, do1, do2)
的行为,正如您在第一个例子中注意到的那样。在do1
中,do2
和cond
中的相关部分将根据TRUE
FALSE
或this <- 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);