构建高效R过滤器

时间:2013-12-20 15:46:41

标签: r filter module performance

我有这个名为data的数据框。在数据框中我有几列,为简单起见,我将用天气类比解释列,它就像“weather_st_louis”,“weather_boston”,“weather_ny”......我想建立一个列“天气”,它应该这样做,“如果存在天气,请使用此栏,否则如果波士顿天气存在,请使用此栏,否则如果天气存在于ny,请使用此栏,否则无”。我将多次使用这个逻辑,有很多列,所以需要一种方法来提高效率。 R的方法是什么。

另外,附带问题,我正在尝试在这里建立一个名为“过滤器”的东西吗?

if(exists("data['w_stlouis']")) {
  data['w'] <- data['w_stlouis']
} else if(exists("data['w_boston]")){
  data['w'] <- data['w_boston']
} else if(exists("data['w_ny']")){
  data['w'] <- data['w_ny']
} else {data['w'] <- NA}

2 个答案:

答案 0 :(得分:0)

尝试类似的东西:

example <- matrix(NA,ncol=5,nrow=5)
colnames(example) <- c("weather_1","weather_2","weather_3","weather_4","weather_5")
example[5,3] <- 1
example[3,2] <- 1
example[1,2] <- 1
example[4,4] <- 1
example[5,2] <- 1



w <- apply(example,1,function(x){
  o <- which(!is.na(x))[1]
  if (is.na(o)) r <- "NONE"
  else r <- colnames(example)[o]
  r
})

w

当你有重复的任务要做时,尝试使用apply / tapply / sapply函数

答案 1 :(得分:0)

这是另一个可能性。我不确定这是否是你需要的,但也许它会为你提供另一种方法来处理它。

df <- data.frame(matrix(rnorm(100, 100, 20),ncol=5,nrow=5))
colnames(df) <- c("weather_1","weather_2","weather_3","weather_4","weather_5")

library(reshape2)
df <- melt(df)
df[1:10,2] <- NA

str(df)

weather_levels <- levels(df$variable)

df$case <- ifelse(is.na(df$value), 0, 1)

这两个输出相同的结果

subset(df, df$case == 1)
na.omit(df)