我有一个列表,其中包含美国的全名状态。
l1<-list(list(c("Arizona")),list(c("California")),list(c("Texas","California","Alabama")))
我想要做的是用不同数据集中的状态缩略词替换全名。
data("state.fips" )
state.fips<-data.frame(state.fips)
为了将每个州的第一个字母转换为state.fips
中的大写,并创建我使用的新列COL2
:
firstup <- function(x) {
substr(x, 1, 1) <- toupper(substr(x, 1, 1))
x
}
state.fips$polyname<- firstup(state.fips$polyname)
state.fips$COL2 <- gsub("([A-Za-z]+).*", "\\1", state.fips$polyname)
然后我创建一个新的空列表:
l2 <- vector('list', 3)
我尝试使用基于state.fips
数据集的状态首字母缩略词替换状态的全名:
for(i in 1:3){
l2[[i]]<-lapply(l1[[i]], function(x)x[which(x %in% state.fips[j,7] )])
for(j in 1:63){
if(sapply(l2[[i]], function(x) length(x) > 0)==TRUE){
l2[[i]]<-gsub(l1[[i]],state.fips[j,5],l1[[i]])
}
else{
l2[[i]]<-l1[[i]]
}
}}
显然它不起作用,更具体地说,在具有多个名称的列表中,它甚至不执行替换。有什么建议?
答案 0 :(得分:0)
首先,你不仅在列表中有一个列表,而且还有另一个向量。这也许就是为什么你只更换了第一个元素&#39;。
我建议,使用2个lapply和一个sapply。
l2 <- lapply(l1, function(sublist){ # iterates over the first list
lapply(sublist, function(state.vector){ # iterates over the second list inside the first list
sapply(state.vector, function(state){ # iterates over the vectors inside the second list
return(state.fips[which(state.fips[,'COL2'] == state),'abb']) # select the abbreviation based on the statename in COL2
})
})
})