首页 > 解决方案 > R根据单元格的部分内容对单元格进行条件编辑

问题描述

我正在使用一个数据集,其中包含许多列为“<.1”的值。我们通过输入一半的值来处理这些值:在这种情况下为 0.05。但是,并非数据集中的每个单元格都有这些 < 符号,因此我不能将数据集中的每个值都减半。如何有条件地编辑数据集以进行更改?似乎很容易解决,但我无法弄清楚。任何帮助深表感谢!!

df <- as.data.frame(matrix(c("0.09", "<.1", "40", "<.07", ".2", "376", "<0.075", "<0.01", "14"), ncol = 3, byrow = TRUE))
df

我希望我的数据看起来像这样:

df1 <- as.data.frame(matrix(c("0.09", "0.05", "40", "0.035", ".2", "376", "0.0375", "0.005", "14"), ncol = 3, byrow = TRUE))
df1

编辑:我已经这样做了:

x <- data[2]

data[2:23] <- lapply(data[2:23], function(x) {
  dohalf <- grepl("^<", x)
  vec2 <- as.numeric(gsub("^<", "", x))
  vec2[dohalf] <- vec2[dohalf]/2
})

但我收到此错误:

Error: Assigned data `lapply(...)` must be compatible with existing data.
x Existing data has 241 rows.
x Element 1 of assigned data has 71 rows.
i Only vectors of size 1 are recycled.

是因为我有NA吗?在 241 个观测值的第一列中只有 71 个值具有此“<”。

标签: r

解决方案


尝试这个:

vec <- c("<.1", ".1", ".5")
dohalf <- grepl("^<", vec)
dohalf
# [1]  TRUE FALSE FALSE
vec2 <- as.numeric(gsub("^<", "", vec))
vec2[dohalf] <- vec2[dohalf]/2
vec2
# [1] 0.05 0.10 0.50

如果您想将它们保留为字符串,那么

as.character(vec2)
# [1] "0.05" "0.1"  "0.5" 

或者您只能根据需要进行数字化/减半/字符串化<*

vec
# [1] "<.1" ".1"  ".5" 
dohalf
# [1]  TRUE FALSE FALSE
vec[dohalf] <- as.character(as.numeric(gsub("^<", "", vec[dohalf]))/2)
vec
# [1] "0.05" ".1"   ".5"  

推荐阅读