使用ifelse清理数据框的问题

时间:2016-07-31 20:33:26

标签: r if-statement dataframe

我是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}}

有关我做错的任何建议吗?

2 个答案:

答案 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]