我知道在R中尽量避免使用循环。因此,我想执行下面代码的功能但不使用嵌套循环。
这些循环检查向量things_I_want_to_find的第f个元素是否存在于thing_to_be_searched的第i行中。例如,当i和f都为1时,代码将检查“声乐”是否存在于john的行中。因为"vocals"确实存在于john的行中,所以将乐器和姓名添加到矢量instrument和name中。当两个循环完成后,这两个向量可以合并成一个data.frame。
我知道在R中有apply()函数家族,但我不知道它们能否用于此情况。有没有人有任何有用的提示或建议?
这些循环检查向量things_I_want_to_find的第f个元素是否存在于thing_to_be_searched的第i行中。例如,当i和f都为1时,代码将检查“声乐”是否存在于john的行中。因为"vocals"确实存在于john的行中,所以将乐器和姓名添加到矢量instrument和name中。当两个循环完成后,这两个向量可以合并成一个data.frame。
我知道在R中有apply()函数家族,但我不知道它们能否用于此情况。有没有人有任何有用的提示或建议?
instrument<-c()
name<-c()
things_I_want_to_find<-c("vocals","drums","rhythm guitar","bass")
thing_to_be_searched<-
data.frame(
id=c("john","paul","george","ringo"),
a=c("vocals","bass","rhythm guitar","oboe"),
b=c("vocals","basoon","piano","clarinet"),
c=c("violin","vocals","french horn","drums"))
for(f in 1:length(things_I_want_to_find))
{
for(i in 1:nrow(thing_to_be_searched))
{
n<-which(thing_to_be_searched[i,]==things_I_want_to_find[f])
if(length(n)>0)
{
instrument<-c(instrument,as.character(thing_to_be_searched[i,][n][,1][1]))
name<-c(name,as.character(thing_to_be_searched$id[i]))
}
}
}
desired_output<-data.frame(name=name,instrument=instrument)
desired_output
name instrument
1 john vocals
2 paul vocals
3 ringo drums
4 george rhythm guitar
5 paul bass