我是R的新手,并尝试使用ifelse清理数据框(MSdatanew)。我想更改变量E2_new,以便无论它编码为“< 0.057”,它现在都被编码为“0.57”。但是,无论它在何处编码为“< 0.057”,我都希望它保持原始编码状态。
head(MSdatanew$E2_new)
[1] 0.102 <0.057 2.797 11.226 5.156 10.032
46 Levels: <0.057 >30 0.058 0.080 0.094 0.102 0.109 0.124 0.136 0.147 ... 9.711
head(MSdataclean$E2_new)
[1] 6.000 0.057 26.000 19.000 32.000 18.000
这样做的结果是,即使变量E2_new不是“<0.57”,它也会被改变
{{1}}
有关我做错的任何建议吗?
答案 0 :(得分:1)
也许将"<"
替换为""
,然后转换为数字:
# dummy data
MSdatanew <- data.frame(E2_new =
c("0.102","<0.057","2.797","11.226","5.156","10.032"))
str(MSdatanew)
# 'data.frame': 6 obs. of 1 variable:
# $ E2_new: Factor w/ 6 levels "<0.057","0.102",..: 2 1 5 4 6 3
# sub "<" and convert to numeric
MSdatanew$E2_new_clean <-
as.numeric(sub("<", "", as.character(MSdatanew$E2_new), fixed = TRUE))
MSdatanew
# E2_new E2_new_clean
# 1 0.102 0.102
# 2 <0.057 0.057
# 3 2.797 2.797
# 4 11.226 11.226
# 5 5.156 5.156
# 6 10.032 10.032
答案 1 :(得分:0)
只需更换因子级别。
levels(MSdatanew$E2_new)[match("<0.057", levels(MSdatanew$E2_new))] <- "0.057"
示例强>
x <- gl(3,2,labels=c("<0","1","2"))
x
#[1] <0 <0 1 1 2 2
#Levels: <0 1 2
levels(x)[match("<0",levels(x))] <- "0"
x
#[1] 0 0 1 1 2 2
#Levels: 0 1 2
如果您想要数值而不是因子,请执行:
x <- as.numeric(levels(x))[x]
x
#[1] 0 0 1 1 2 2
同样适用于MSdatanew$E2_new
,请使用:
MSdatanew$E2_new <- as.numeric(levels(MSdatanew$E2_new))[MSdatanew$E2_new]