R:在向量之间匹配元素-如何优化代码

时间:2019-07-26 11:10:50

标签: r function optimization vector match

让我们的图像具有几个人的描述的数据框:

des <- c('mad', 'crazy','stupid', 'crazy','wise','dumb','mad','furious')
id <- c(1,2,3,4,5,6,7,8)
d <-data.frame(id,des)
d$dangerous <- NA
dan <-c('mad','crazy','furious')

我们要使d$des与向量dan中的描述相匹配

我准备了以下功能:

for (i in 1:nrow(d)){
  for(j in 1:length(dan)){
    if (d$des[i]==dan[j])
      {d$dangerous[i] <- 1 }
  } }
d
  id     des dangerous
1  1     mad         1
2  2   crazy         1
3  3  stupid        NA
4  4   crazy         1
5  5    wise        NA
6  6    dumb        NA
7  7     mad         1
8  8 furious         1

代码运行良好,但是我想知道如果可以处理更长的向量和数据帧,如何优化代码。有任何想法吗?

3 个答案:

答案 0 :(得分:2)

ifelse()%in%一起使用将达到目的:

d$dangerous<-ifelse(des %in% dan, 1,NA)
> d
  id     des dangerous
1  1     mad         1
2  2   crazy         1
3  3  stupid        NA
4  4   crazy         1
5  5    wise        NA
6  6    dumb        NA
7  7     mad         1
8  8 furious         1

答案 1 :(得分:2)

以下是几种解决方案以及我的解决方案的时间安排。
我将函数与原始data.frame try { Class.forName("oracle.jdbc.driver.OracleDriver"); conn = DriverManager.getConnection(url, decodedUsername, decodedPassword); stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rs = stmt.executeQuery(query); if (rs != null) { rs.last(); // moves cursor to the last row size = rs.getRow(); // get row id } for (int i = 0; i < size; i++) { //column is the column name in sql column = rs.getString("propertyname"); //value is the corresponding value value = rs.getString("propertyvalue"); data[0][i] = column; data[1][i] = value; System.out.println(data); } } 和更大的data.frame一起计时,因为OP表示这是一个优化问题。

d

答案 2 :(得分:1)

另一个选择:

transform(d, dangerous = replace(dangerous, des %in% dan, 1))

  id     des dangerous
1  1     mad         1
2  2   crazy         1
3  3  stupid        NA
4  4   crazy         1
5  5    wise        NA
6  6    dumb        NA
7  7     mad         1
8  8 furious         1

或者:

d$dangerous[d$des %in% dan] <- 1