【问题标题】:How can I replace hyphen "cells" in R data frames with zeros?如何用零替换 R 数据帧中的连字符“单元格”?
【发布时间】:2014-07-14 20:29:37
【问题描述】:

我有一个数据框,其中包含一些正数、一些负数、一些单词和一些连字符“单元格”,例如:

Revenue                 73.88   74.76    78.02   78.19  68.74
Other Revenue - Total   -       -        -       -       -
Total Revenue           73.88   74.76    78.02   78.19  68.74
Cost of Revenue - Total 21.09   21.61    23.01   22.76  19.99
Gross Profit            52.80    -53.15  -55.01  55.43  48.75

我想用 0 替换仅在倒数第二列中找到的连字符,但前提是连字符不在数字的开头。例如,我不想将负数变为正数。

我试过了:

df[-1] <- lapply(df[-1], function(x) as.numeric(gsub("-", 0, x)))

但返回前一个数据帧为:

Revenue                 NA      NA       NA      NA     NA
Other Revenue - Total   0       0        0       0      0
Total Revenue           NA      NA       NA      NA     NA
Cost of Revenue - Total NA      NA       NA      NA     NA
Gross Profit            NA      NA       NA      NA     NA 

这是我绝对不想要的。我该如何解决这个问题?

谢谢。

这是我调用 str() 时的输出:

str(income)
'data.frame':   49 obs. of  6 variables:
 $ Items  : Factor w/ 49 levels "Accounting Change",..: 44 40 47 7 23 45 43 9 29 49 ...
 $ Recent1: Factor w/ 14 levels "-","0.00","11,305.00",..: 4 1 4 11 14 6 5 1 1 1 ...
 $ Recent2: Factor w/ 16 levels "-","-29.00","0.00",..: 5 1 5 15 16 9 6 1 1 2 ...
 $ Recent3: Factor w/ 17 levels "-","0.00","11,449.00",..: 5 1 5 15 17 10 6 1 1 4 ...
 $ Recent4: Factor w/ 18 levels "-","-31.00","0.00",..: 6 1 6 15 17 9 4 1 1 18 ...
 $ Recent5: Factor w/ 14 levels "-","0.00","1,617.00",..: 4 1 4 10 13 5 3 1 1 1 ...

【问题讨论】:

  • 这些列是数字的吗?我怀疑他们不是?
  • 对不起,我忘了说它们是因素。
  • 为什么它们是因素?对我来说,它们看起来不太像因素。它们只是因为您的read.csv 设置了stringsasfactors 而根据因素自动创建吗?
  • 是的,它们被 read.xls 自动制成因子

标签: r dataframe plyr lapply


【解决方案1】:

正如@Joe 所暗示的,data.frame 的列中的值必须属于同一类型,因此假设您在与 numerics 相同的向量中有 -s( 52.80、21.09 等...),每列都被强制输入character(大概)。尝试使用"0" 而不是0 使用gsubbing,然后将列转换为numeric。由于您将0 强制转换为character 列向量,因此它将其余向量元素强制转换为NA

DF <- data.frame(
  X1=c(12,45,67,"-",9),
  X2=c(34,45,56,"-",12))
str(DF)
'data.frame':   5 obs. of  2 variables:
 $ X1: chr  "12" "45" "67" "-" ...
 $ X2: chr  "34" "45" "56" "-" ...
##
DF2 <- DF
DF2$X1 <- gsub("-","0",DF2$X1)
DF2$X1 <- as.numeric(DF2$X1)
str(DF2)
'data.frame':   5 obs. of  2 variables:
 $ X1: num  12 45 67 0 9
 $ X2: chr  "34" "45" "56" "-" ...

编辑:要删除值中的逗号,

DF <- data.frame(
  X0=c("A","B","C","D"),
  X1=c("12,300.04","45.5","-","9,046.78"),
  X2=c("1,0001.12","33","-","12.6"))
for(j in 2:ncol(DF)){
  DF[,j] <- gsub(",","",as.character(DF[,j]))
  for(i in 1:nrow(DF)){
    if(nchar(DF[i,j])==1){
      DF[i,j] <- gsub("-","0",DF[i,j])
    } else {
      next
    }
  }
  DF[,j] <- as.numeric(DF[,j])
  DF[,j]
}

使用*apply 函数和正则表达式有更有效的方法,但这应该有效。我不得不考虑这样一个事实,即您的某些值是负值,因此假设其中只有一个 - 的单元格只有一个字符长,这应该可以修复它们而不影响其他单元格中的负值。

【讨论】:

  • 我刚刚尝试过,但没有成功。它给了我与上次相同的结果,与 NA。我的数据框原本是因子的数据框,即使我将它们转换为字符,我仍然得到相同的结果。
  • 这很奇怪,我用上面的示例数据进行了尝试,没有得到任何 NA 值。你能在你的data.frame上调用str()并发布输出吗?
  • 啊,我认为您的某些值中的逗号最初没有显示。让我在答案的底部添加一些代码,以便我可以正确格式化它。请稍等。
【解决方案2】:

假设它被命名为dat:

  dat[2:6] <- lapply( dat[2:6], function(col) as.numeric( gsub("-$|\\,", "", col) ) )
  dat[is.na(dat)] <- 0

仅替换字符串末尾的减号,删除逗号,gsub 将因子强制转换为字符,因此您无需添加 as.character。当我使用read.fwftextConnection 导入您的数据时,我得到了尾随空格。您可以先使用 gdata::trim 删除它们,但这很有效:

lapply(dat[2:6], function(col) as.numeric( gsub("-[ ]*$|\\,", "", col ) ) ) # on RHS 

 dat<-read.fwf(textConnection("Revenue                 73.88   74.76    78.02   78.19  68.74
 Other Revenue - Total   -       -        -       -       -
 Total Revenue           73.88   74.76    78.02   78.19  68.74
 Cost of Revenue - Total 21.09   21.61    23.01   22.76  19.99
 Gross Profit            52.80    -53.15  -55.01  55.43  48.75"), widths=c(24, rep(8,5)))

 dat[2:6] <- lapply( dat[2:6], function(col) as.numeric( gsub("-$|\\,", "", col) ) )
 dat[is.na(dat)] <- 0
 dat
#----------
                        V1    V2     V3     V4    V5    V6
1 Revenue                  73.88  74.76  78.02 78.19 68.74
2 Other Revenue - Total     0.00   0.00   0.00  0.00  0.00
3 Total Revenue            73.88  74.76  78.02 78.19 68.74
4 Cost of Revenue - Total  21.09  21.61  23.01 22.76 19.99
5 Gross Profit             52.80 -53.15 -55.01 55.43 48.75

【讨论】:

    猜你喜欢
    • 2018-07-19
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 2018-06-13
    • 2014-04-10
    • 1970-01-01
    • 2020-05-16
    • 2019-04-05
    相关资源
    最近更新 更多