R套用结果不一致

时间:2019-04-02 19:51:29

标签: r

我调用apply在我的数据帧的每一行上应用一个函数,但是我得到了一些奇怪的结果。当我第一次运行apply(运行#1)时,只有一部分行产生了预期的结果。第二次运行apply(运行#2)后,一些最初不正确的值是正确的。一致的是,运行#1后哪些行不正确。

assign_id()在数据框中查找first中位于其他九个列中的ID,并返回与该列匹配的整数。

assign_id <- function(row) {
  if(is.na(row['first'])) {
    return(NULL)
  }
  else if(row['first'] %in% c('none')) {
    return(0)
  }
  else if(row['first'] %in% as.character(row['one'])){
    return(1)
  }
  else if(row['first'] %in% as.character(row['two'])){
    return(2)
  }
  else if(row['first'] %in% as.character(row['three'])){
    return(3)
  }
  else if(row['first'] %in% as.character(row['four'])){
    return(4)
  }
  else if(row['first'] %in% as.character(row['five'])){
    return(5)
  }
  else if(row['first'] %in% as.character(row['six'])){
    return(6)
  }
  else if(row['first'] %in% as.character(row['seven'])){
    return(7)
  }
  else if(row['first'] %in% as.character(row['eight'])){
    return(8)
  }
  else if(row['first'] %in% as.character(row['nine'])){
    return(9)
  } else {
    return(11)
  }
}

df <- read.csv('df.csv')

# Run #1
df$id <- apply(df, 1, assign_id)
# All 'id' fields return 11
df[df$first %in% 55627, c('id', 'first', 'six')] 

> head(df[df$first %in% 55627, c('id', 'first', 'six')])
     id first    six
414  11 55627  55627
529  11 55627 118950
791  11 55627  55627
1570 11 55627 118950
1832 11 55627 118950
2116 11 55627 118950

# Run #2
df$id <- apply(df, 1, assign_id)
# All 'id' fields return the correct integer
df[df$first %in% 55627, c('id', 'first', 'six')] 

> head(df[df$first %in% 55627, c('id', 'first', 'six')])
     id first    six
414   6 55627  55627
529   5 55627 118950
791   6 55627  55627
1570  8 55627 118950
1832  5 55627 118950
2116  5 55627 118950

数据位于here

1 个答案:

答案 0 :(得分:1)

friends的帮助下,我想到了一个更简单的base-R解决方案:

df$id<-unlist(apply(df,1,function(x)
  ifelse(x["first"]=="none",0, which(as.integer(x["first"])==as.integer(x[2:10])))))

请参阅此处的答案,以解释apply为何存在问题-简要地说,它会将您的所有数据转换为字符,但是随后以使比较失败的方式填充了数据。

在相关说明中,当您read.csv时,您可能希望添加stringsAsFactors=FALSE,以避免将first列作为一个因素。