【问题标题】:R replace value according to its current value in data frameR根据数据框中的当前值替换值
【发布时间】:2012-06-19 10:03:22
【问题描述】:

我有一个尺寸约为 ts1[100, 2000] 的数据框,如下所示:

> ts1[1:8, 1:6]
       DD LEVEL     X136747     X136749     X136752     X136753     ... ...
1 D04MX.x    LC        0.25        0.30       -0.01       -0.05
2 D08MX.x    LC        0.22        0.11        0.11        0.00
3 D15MX.x    LC        0.31        0.33       -0.23       -0.08
4 D29MX.x    LC        0.28        0.14       -0.28       -0.08
5 D04HX.x    SC        0.11       -0.26       -0.21       -0.33
6 D08HX.x    SC        0.25       -0.23       -0.07       -0.25
7 D15HX.x    SC        0.29        0.03       -0.05       -0.10
8 D29HX.x    SC        0.29        0.13       -0.09        0.02
... ...

我想将名为 X###### (ts1[3:ncol(ts1)]) 的列下所有介于 -0.1 和 0.1 之间的值替换为 0。我尝试了以下操作:

> ts1 <- ifelse(abs(ts1) < 1, 0, ts1)
Error in Math.data.frame(ts1) : 
  non-numeric variable in data frame: DDLEVEL
> ts1[which(abs(ts1) < 1)] <- 0
Error in Math.data.frame(ts1) : 
  non-numeric variable in data frame: DDLEVEL
> ts1[which(abs(is.numeric(ts1)) < 1)] <- 0
> ts1
  DD LEVEL X1367471_at X1367495_at X1367527_at X1367536_at
1  0    LC        0.25        0.30       -0.01       -0.05
2  0    LC        0.22        0.11        0.11        0.00
3  0    LC        0.31        0.33       -0.23       -0.08
... ...
> ts1 <- ts1[, lapply(.SD[3:ncol(ts1)], ifelse(abs(ts1) < 1, 0, ts1))]
Error in Math.data.frame(ts1) : 
  non-numeric variable in data frame: DDLEVEL

我做错了什么?我确实需要保留前两列。有什么捷径吗?谢谢。

【问题讨论】:

    标签: r replace conditional dataframe


    【解决方案1】:

    假设你的数据被命名为df:

    colsToEdit <- grepl("X", names(df))
    df[, colsToEdit][abs(df[, colsToEdit]) <= 0.1] <- 0
    

    给你:

     DD LEVEL X136747 X136749 X136752 X136753
    1 D04MX.x    LC    0.25    0.30    0.00    0.00
    2 D08MX.x    LC    0.22    0.11    0.11    0.00
    3 D15MX.x    LC    0.31    0.33   -0.23    0.00
    4 D29MX.x    LC    0.28    0.14   -0.28    0.00
    5 D04HX.x    SC    0.11   -0.26   -0.21   -0.33
    6 D08HX.x    SC    0.25   -0.23    0.00   -0.25
    7 D15HX.x    SC    0.29    0.00    0.00    0.00
    8 D29HX.x    SC    0.29    0.13    0.00    0.00
    

    【讨论】:

    • 非常感谢,它成功了。但是,在 Core 2 Due 2.5x GHz 桌面上完成 [164, 6247] 的数据帧需要 410 秒(约 7 分钟)。想知道有没有更快的方法?为什么我不能使用 df[,3:ncol(df)],因为有时我可能在另一个列名中有一个“X”。
    • @user- 没有意识到速度会成为问题。可能有更快的方法,让我思考一下。对于您的另一个问题,这应该可以工作,尽管不是在比较检查...或调整您的正则表达式以更具选择性。
    猜你喜欢
    • 2021-04-13
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 2014-12-15
    相关资源
    最近更新 更多