让我们的图像具有几个人的描述的数据框:
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
代码运行良好,但是我想知道如果可以处理更长的向量和数据帧,如何优化代码。有任何想法吗?
答案 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