我继承了一个电子表格,作为数据框架读取,大约有10列和400行。
在下面的示例中,对于其中一列,您可以看到它包含两个百分比值和分数的混合。
此外,此类分数可能包含'*'和/或'0',以及分子或分母中,如以下示例案例的OBSERVED列所示。
我寻求您对R代码的帮助,以便将这些列中的所有条目均匀化为十进制数字,如下面的示例中EXPECTED列所示,然后在数据帧中的所有列上重复该过程。
对于我的分析,将缺失的值(*(视为零(0(是完全可以的。
示例案例:
观察到的与预期的
"0.0%" 0.0
"9.5%" 0.095
"5 / 10" 0.5
"* / 16" 0.0
"0 / 12" 0.0
NA 0.0
"0 / *" 0.0
"* / *" 0.0
到目前为止,我尝试的内容如下(按相同顺序(:
步骤1。用0(零(替换*(丢失数据(-正常工作
CFP4_REPLACE_Asterisk_w_Zero <- gsub("\*","0",play.df$CFP4)
步骤2。将%转换为小数-仅适用于带有%符号的条目,但将分数转换为NA
CFP4_ConvPerc2Dcml <- as.numeric(sub("%", "",CFP4_REPLACE_Asterisk_w_Zero,fixed=TRUE))/100
步骤3。将分数转换为十进制值-如下所示的语法,我认为还可以,但在这个顺序的步骤中,分数已经转换为NA,所以在这里执行没有意义。。。正确的
CFP4_ConvFrct2Dcml <- sapply(CFP4_ConvPerc2Dcml, function(x) eval(parse(text=x)))
如果我颠倒步骤2和3的相对顺序,那也无济于事。我已经从R那里休息了一下,如果有任何(详细的(帮助,我将不胜感激。TIA!
您可以尝试使用此函数:
standardize_numbers <- function(x) {
#Initialize a new vector
new_vec <- numeric(length = length(x))
#Get indices where "%" is present
inds1 <- grepl('%', x)
#Replace % value
new_vec[inds1] <- as.numeric(sub('%', '', x[inds1]))/100
#Get indices where "*" or "/" is present
inds2 <- grepl('\*|/', x)
#Replace "*" with 0
value2 <- gsub('\*', '0', x[inds2])
#Remove whitespace
value2 <- gsub('\s', '', value2)
#Use eval parse to get value2 as numbers.
new_vec[inds2] <- sapply(value2, function(y) eval(parse(text = y)))
new_vec
}
x <- c("0.0%", "9.5%", "5 / 10", "* / 16", "0 / 12", NA, "0 / *", "* / *")
standardize_numbers(x)
#[1] 0.000 0.095 0.500 0.000 0.000 0.000 NaN NaN
可以使用lapply
将其应用于多个列。