【问题标题】:Removing character data from numeric dataframe in R从R中的数字数据框中删除字符数据
【发布时间】:2016-09-22 12:18:22
【问题描述】:

我有一个数据框,它的标头基本上被回收了几次,所以它看起来像这样:

var1    var2    var3    var4
   1       1       1     'ch'
   1       1       1     'ch'
   1       1       1     'ch'
var1    var2    var3    var4
   1       1       1     'ch'
   1       1       1     'ch'
   1       1       1     'ch'
var1    var2    var3    var4

大部分变量都有数值;但是,有些具有字符-因此将整个 df 转换为数字对我没有帮助。我想知道如何对数据框进行子集化以删除重新出现的标头?所以,最后我会得到这个:

var1    var2    var3    var4
   1       1       1     'ch'
   1       1       1     'ch'
   1       1       1     'ch'
   1       1       1     'ch'
   1       1       1     'ch'
   1       1       1     'ch'

【问题讨论】:

  • df[df$var4 != 'var4',] ?
  • 然后使用df[] <- lapply(df, type.convert)
  • 另外,df[!rowSums(df==names(df)), ]

标签: r dataframe subset


【解决方案1】:

你可以试试这个:

df[,1:3] <- sapply(df[,1:3], function(x) as.integer(as.character(x)))
df <- df[complete.cases(df),]

【讨论】:

  • 很好,但如果数据集中有任何其他NA 值会导致问题...
【解决方案2】:

拥有额外的标题会将您的所有数据转换为因子(如果您使用stringsAsFactors=FALSE,则为字符):

dd <- read.table(text="var1    var2    var3    var4
   1       1       1     'ch'
   1       1       1     'ch'
   1       1       1     'ch'
var1    var2    var3    var4
   1       1       1     'ch'
   1       1       1     'ch'
   1       1       1     'ch'
var1    var2    var3    var4")

将除最后一列之外的所有列转换为数字(忽略警告):

dd[,1:3] <- lapply(dd[,1:3],
                    function(x) as.numeric(as.character(x)))

丢弃前三列为NA的行:

dd <- dd[apply(dd[,1:3],1,function(x)!all(is.na(x))),]

【讨论】:

    【解决方案3】:

    这个怎么样:

    rpts <- unique(as.vector(sapply(1:ncol(d), function(i) which(names(d)[i]==d[,i]))))
    d <- d[-1*rpts,]
    

    第一行提取所有列中出现相应列名的行(即names(d))。第二行用于删除那些提取的行(即rpts)。

    数据

    d <- structure(list(var1 = structure(c(1L, 1L, 1L, 2L, 1L, 1L, 1L, 
    2L), .Label = c("1", "var1"), class = "factor"), var2 = structure(c(1L, 
    1L, 1L, 2L, 1L, 1L, 1L, 2L), .Label = c("1", "var2"), class = "factor"), 
        var3 = structure(c(1L, 1L, 1L, 2L, 1L, 1L, 1L, 2L), .Label = c("1", 
        "var3"), class = "factor"), var4 = structure(c(1L, 1L, 1L, 
        2L, 1L, 1L, 1L, 2L), .Label = c("ch", "var4"), class = "factor")), .Names = c("var1", 
    "var2", "var3", "var4"), class = "data.frame", row.names = c(NA, 
    -8L))
    

    【讨论】:

      猜你喜欢
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 2011-03-28
      • 1970-01-01
      相关资源
      最近更新 更多