正在处理混合条目为%、未定义分数为0和*的数据帧列

  • 本文关键字:数据帧 混合 处理 未定义 r
  • 更新时间 :
  • 英文 :


我继承了一个电子表格,作为数据框架读取,大约有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将其应用于多个列。

最新更新