基本上我要做的是,搜索“incode”列以查找与预定列表匹配的代码(例如53和55) - 如果有代码,我想返回“位置”代码匹配的“位置”列并将此向量添加到数据集。同一行可能有多个代码匹配,所以我只想匹配第一个(从左到右)。
作为一个额外的挑战,我想指定手术代码(53,55)和要搜索的列(2-4)以及用于查找和替换值(5-7)的列的名称(incode1-3) ,和location1-3)而不是列号。
我的想法是这样的:
我需要使用apply在数据集中逐行执行此操作。
我需要使用'match'函数来确定incode列中哪一行(第一行)具有匹配的代码
然后,我需要使用此列指示符来指定我应该从哪个位置代码列返回值。
我一直在努力比赛和申请,但还没有找到有用的东西。欢迎任何建议,我在下面列出了一些样本和所需的输出数据。
# list of columns to search
search <- (paste("incode",seq(1:3),sep=""))
# list of columns to return value from
return <- (paste("location",seq(1:3),sep=""))
# codes to search for
codes <- c("^53","^55")
# example data
id = c(1,2,3,4)
incode1 =c("53","45", "55", "45")
incode2 =c("53", NA, NA, "45")
incode3 =c(NA, NA, NA, NA)
location1 =c(1,2,1,1)
location2 =c(1, NA, NA, 2)
location3 =c(NA, NA, NA, NA)
data_example <- data.frame(id,incode1,incode2,incode3,location1,location2,location3)
# desired data
indicator = c(1,NA,1,2)
data_desired <- data.frame(id,incode1,incode2,incode3,location1,location2,location3,indicator)
编辑1:我的尝试但仍无法正常工作
data$indicator <- apply(data[(match((paste0('\\b(',paste
(codes,collapse="|"),),')')))',data[,search], nomatch=NA)),],1,)
我还没弄清楚在哪里指定要从(返回)返回值的列,虽然我知道这必须应用于某些地方的数据[...]
如果您有任何建议,他们会受到欢迎。 谢谢。
答案 0 :(得分:1)
如果我正确理解您的问题,那么在对您声明的变量进行一些更改后,以下内容应该有效。
### i made all the data numbers instead of strings
id = c(1,2,3,4)
incode1 =c(53,45, 55, 45)
incode2 =c(53, NA, NA, 45)
incode3 =c(NA, NA, NA, NA)
location1 =c(1,2,1,1)
location2 =c(1, NA, NA, 2)
location3 =c(NA, NA, NA, NA)
data_example <- data.frame(id,incode1,incode2,incode3,location1,location2,location3)
### i changed the name of 'return' to "locations" because
### return is generally used to return a value in R...
### you don't use it as a variable name
search <- (paste("incode",seq(1:3),sep=""))
locations <- (paste("location",seq(1:3),sep=""))
codes <- c(53,55)
### separated into two dataframes so we can use sapply
### because in a sense our incode values are the decision data
### and the locationdata is the map we want to pull values from
incodedata <- data_example[,search]
locationdata <- data_example[,locations]
### using a combination of sapply and ifelse we can do what you desire
indicator <- sapply(1:nrow(incodedata),function(m)
ifelse(any(!is.na(z <- match(codes,incodedata[m,]))),locationdata[m,z[!is.na(z)][1]],NA))
data_example$indicator <- indicator