[英]How can I replace hyphen “cells” in R data frames with zeros?
我有一个数据框,其中包含一些正数,一些负数,一些单词和一些连字符“单元格”,例如:
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 ...
正如@Joe所暗示的那样,data.frame列中的data.frame
必须具有相同的类型,因此,假设您在-
-s相同的向量中具有-s,它们似乎是numeric
s(52.80、21.09等)。 。),则强制每一列键入character
(大概)。 尝试使用"0"
而不是0
gsub
bing,然后将列转换为numeric
。 由于将character
列向量强制为0
,因此将其余向量元素强制为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
函数和正则表达式有更有效的方法,但这应该可行。 我不得不考虑一个事实,即您的某些值是负数,因此,假设只有-
的单元格只有一个字符长,这应该可以解决这些问题而不会影响其他单元格中的负值。
假设它名为dat
:
dat[2:6] <- lapply( dat[2:6], function(col) as.numeric( gsub("-$|\\,", "", col) ) )
dat[is.na(dat)] <- 0
仅在字符串末尾替换减号,删除逗号和gsub as.character
为字符的因数,因此您无需添加as.character
。 当我使用read.fwf
和textConnection
导入数据时, textConnection
了尾随空格。 您可以先使用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.