如何在 R 中不使用循环和 IF 语句
How to not use loops & IF-statements in R
我在 R 中有两个数据框,一个很大但不完整(导入),我想创建一个较小的完整子集(导出)。 $unique_name 列中的每个 ID 都是唯一的,不会出现两次。其他列可能是体重,也可能是与唯一 ID 相对应的其他类别。我编写了这段代码,一个双循环和一个 if 语句,它确实有效,但速度很慢:
for (j in 1:length(export$unique_name)){
for (i in 1:length(import$unique_name)){
if (toString(export$unique_name[j]) == toString(import$unique_name[i])){
export$body_mass[j] <- import$body_mass[i]
}
}
}
我对 R 不是很好,但我知道这是一种糟糕的方法。关于如何使用 apply() 或 plyr 包等函数执行此操作的任何提示?
比约恩
根据A.Webb建议您需要加入:
# join data on unique_name
joined=merge(export, import[c("unique_name", "body_mass")], c('unique_name'))
joined$body_mass=joined$body_mass.y # update body_mass from import to export
joined$body_mass.x=NULL # remove not needed column
joined$body_mass.y=NULL # remove not needed column
export=joined;
注意:如下所示使用"which"函数。这将减少循环迭代
for (j in 1 : nrow(export)){
index<- which(import$unique_name %in% export$unique_name[j])
if(length(index)=1)
{
export$body_mass[j] <- import[index[1],"body_mass"]
}
}
有很多函数可以做到这一点。查看..
library(compare)
compare(DF1,DF2,allowAll=TRUE)
或如@A.Webb所述Merge
是非常方便的功能。
merge(x = DF1, y = DF2, by.x = "Unique_ID",by.y = "Unique_ID", all.x = T, sort = F)
如果您更喜欢 SQL 风格的语句,那么
library(sqldf)
sqldf('SELECT * FROM DF1 INTERSECT SELECT * FROM DF2')
易于实施并避免 for
和 if
条件
我在 R 中有两个数据框,一个很大但不完整(导入),我想创建一个较小的完整子集(导出)。 $unique_name 列中的每个 ID 都是唯一的,不会出现两次。其他列可能是体重,也可能是与唯一 ID 相对应的其他类别。我编写了这段代码,一个双循环和一个 if 语句,它确实有效,但速度很慢:
for (j in 1:length(export$unique_name)){
for (i in 1:length(import$unique_name)){
if (toString(export$unique_name[j]) == toString(import$unique_name[i])){
export$body_mass[j] <- import$body_mass[i]
}
}
}
我对 R 不是很好,但我知道这是一种糟糕的方法。关于如何使用 apply() 或 plyr 包等函数执行此操作的任何提示?
比约恩
根据A.Webb建议您需要加入:
# join data on unique_name
joined=merge(export, import[c("unique_name", "body_mass")], c('unique_name'))
joined$body_mass=joined$body_mass.y # update body_mass from import to export
joined$body_mass.x=NULL # remove not needed column
joined$body_mass.y=NULL # remove not needed column
export=joined;
注意:如下所示使用"which"函数。这将减少循环迭代
for (j in 1 : nrow(export)){
index<- which(import$unique_name %in% export$unique_name[j])
if(length(index)=1)
{
export$body_mass[j] <- import[index[1],"body_mass"]
}
}
有很多函数可以做到这一点。查看..
library(compare)
compare(DF1,DF2,allowAll=TRUE)
或如@A.Webb所述Merge
是非常方便的功能。
merge(x = DF1, y = DF2, by.x = "Unique_ID",by.y = "Unique_ID", all.x = T, sort = F)
如果您更喜欢 SQL 风格的语句,那么
library(sqldf)
sqldf('SELECT * FROM DF1 INTERSECT SELECT * FROM DF2')
易于实施并避免 for
和 if
条件