【问题标题】:Apply function to frame of characters in R将函数应用于R中的字符框架
【发布时间】:2016-11-18 09:42:56
【问题描述】:

我有一组字符变量,我试图通过创建以下函数并使用 apply() 函数将它们转换为二进制:

a <- as.factor(c("n/a", "False", "False", "True"))
b <- as.factor(c("n/a", "True", "False", "True"))
y <- data.frame(a,b)


conv <- function(x){
    levels(x)[which(levels(x)=="n/a")] <- NA
    levels(x)[which(levels(x)=="False")] <- 0
    levels(x)[which(levels(x)=="True")] <- 1
    x <- as.numeric(levels(x))[x]
    return(x)
}

apply(y,2, conv)

但是,当我这样做时,它会输出 NA。或者,如果您按列应用函数,它可以工作:

conv(y[,1])
conv(y[,2])

预期的输出应该是:

y:
NA NA
0 1
0 0 
1 1

对为什么会发生这种情况有任何想法吗?谢谢。

【问题讨论】:

  • 你能显示你的预期输出吗?
  • @akrun 我刚刚将它添加到帖子中。
  • 你的函数没问题,用lapply代替apply

标签: r frame apply


【解决方案1】:

你的功能很好,你只需要使用lapply

conv <- function(x){
    levels(x)[which(levels(x)=="n/a")] <- NA
    levels(x)[which(levels(x)=="False")] <- 0
    levels(x)[which(levels(x)=="True")] <- 1
    x <- as.numeric(levels(x))[x]
    return(x)
}

lapply(y,conv)

此外,如果所有变量的级别顺序相同,那么您可以这样做。

conv <- function(x){
    levels(x)=c(0,NA,1)
    return(x)
}

lapply(y, conv)

【讨论】:

    【解决方案2】:

    一个简单的ifelse 可以满足NA 的要求。 grepl 然后可用于转换为 0/1,即

    y[] <- lapply(y[], function(i) ifelse(i == 'n/a', NA, grepl('True', i)*1))
    y
    #   a  b
    #1 NA NA
    #2  0  1
    #3  0  0
    #4  1  1
    

    【讨论】:

      【解决方案3】:

      R 中,逻辑值为 TRUE/FALSE,而不是字符串“True”、“False”。另外NA是缺失值

      y[] <- NA^(is.na(replace(as.matrix(y), y=="n/a", NA)))*+(y=='True')
      y
      #   a  b
      #1 NA NA
      #2  0  1
      #3  0  0
      #4  1  1
      

      【讨论】:

      • 如何将 n/a 保留为 NA?使用此代码,它们将转换为 0
      • @coding_heart 如果你看第一行,那是 NA。
      • @coding_heart 如果要更新原始数据集,请分配它,即y[] &lt;- NA^(is.na(replace(as.matrix(y), y=="n/a", NA)))*+(y=='True')
      猜你喜欢
      • 2020-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      相关资源
      最近更新 更多