R - 没有for循环的数据帧操作

时间:2016-03-22 18:58:22

标签: r

如果第一列是T或F,我想读取一个数据帧读取,并且根据这一点,我将使用第二列中的数据向矩阵中的新列添加一个新条目。

If z[,1] == true set z[,4] to 2*z[,2]
else set z[,4] to z[,2]

设置第1列中的行是否为true,将新条目设置为第二列的2倍,否则只需将其设置为该索引处第二列的值

让我们创建z:

set.seed(4)
z <- data.frame(first=c(T, F, F, T, F), second=sample(-2:2),
                third=letters[5:1], stringsAsFactors=FALSE)
z

这是我的for循环:

for(i in 1:nrow(z)){
  if(z$first == TRUE){
    z$newVar2 <- 2*z$second
  }
  else{
    z$newVar2 <- z$second
  }
}

这里没有for循环:

z$newVar<-ifelse(z$first==TRUE, 2*z$second, z$second)

申请时有办法做到这一点吗?有没有更有效的方法来完成这项任务?

2 个答案:

答案 0 :(得分:2)

不是你提出的问题,但是如果使用矩阵数据结构,你也可以探索data.table方法:

#Make data.table
setDT(z)
setkey(z)

#Write function to do all the stuff
myfun <- function(first, second){ifelse(first, 2*second, second)}

#Do stuff
z[, newvar2:=myfun(first, second)]

#Printing z
   first second third newvar2
1: FALSE     -2     d      -2
2: FALSE     -1     a      -1
3: FALSE      1     c       1
4:  TRUE      0     e       0
5:  TRUE      2     b       4

答案 1 :(得分:2)

我们可以通过利用let descriptor = UIFontDescriptor(name: "OpenSans-Semibold", size: 10.0) label.font = UIFont(descriptor: descriptor, size: 10.0)

这一事实,以更有效的方式使用if let font = UIFont(name: "OpenSans-Semibold", size: 10) { label.font = font } 而无需定义函数
data.table