使用R

时间:2018-01-18 03:44:48

标签: r if-statement replace sapply

我有一个列表,其中包含美国的全名状态。

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]]
     }
   }}

显然它不起作用,更具体地说,在具有多个名称的列表中,它甚至不执行替换。有什么建议?

1 个答案:

答案 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
    })
  })
})