我需要在命名列表上循环一个函数,其中list[i]
是一个参数,names(list)[i]
是另一个参数。
这里有一些伪代码:
#generate DF
employee <- c('John Doe','Peter Gynn','Jolie Hope')
salary <- c(21000, 23400, 26800)
startdate <- as.Date(c('2010-11-1','2008-3-25','2007-3-14'))
df <- data.table(employee, salary, startdate)
df$'tags' <- NA
#Create named list
test <- list(
'JMan' = 'Doe',
'PMan' = 'Peter',
'JMan' = 'Hope'
)
#Create function to populate df$tags with output
func <- function(pattern, name) {
df[, tags := fcase(
employee %like% regex(pattern), name,
rep(TRUE, nrow(df)), as.character(df$tags)
)
]
}
#test function
df <- func(as.character(test[1]), names(test)[1])
这一切都很好:
employee salary startdate tags
1: John Doe 21000 2010-11-01 JMan
2: Peter Gynn 23400 2008-03-25 <NA>
3: Jolie Hope 26800 2007-03-14 <NA>
然而,当我尝试迭代它时:
for (i in test) {
df <- func(as.character(test[i]), names(test)[i])
}
什么也没发生。
如有任何帮助,我们将不胜感激。我试过用苹果((和苹果((,但没有成功。
您可以将函数更改为并使用for
循环进行替换。
library(data.table)
func <- function(df, pattern, name) {
df[grepl(pattern, employee), tags := name]
}
for (i in seq_along(test)) {
df <- func(df, test[[i]], names(test)[i])
}
df
# employee salary startdate tags
#1: John Doe 21000 2010-11-01 JMan
#2: Peter Gynn 23400 2008-03-25 PMan
#3: Jolie Hope 26800 2007-03-14 JMan
数据
employee <- c('John Doe','Peter Gynn','Jolie Hope')
salary <- c(21000, 23400, 26800)
startdate <- as.Date(c('2010-11-1','2008-3-25','2007-3-14'))
df <- data.table(employee, salary, startdate)
df$tags <- NA_character_
这里有一个额外的答案,对其进行了一些压缩,并取消了for循环,只是为了提供更多的想法。(注意,你能保证每个员工只有一场比赛吗?(
df <- data.table(employee, salary, startdate)
func <- function(employee) {
i <- sapply( unlist(test), grepl, x=employee[1] )
if(!any(i))
return(NA)
names(test)[i]
}
df[, tags := func(employee) , by=1:nrow(df) ]