如何在整个数据框中使用计算值替换负值

时间:2017-07-13 12:26:12

标签: r dataframe

我有一个巨大的数据框,在不同的列中有许多负值,应该等于它们的原始值* 0.5。 我试图应用许多R函数,但似乎我找不到一个函数来处理整个数据帧。 我想要类似下面的代码(不工作):

mydf[] <- replace(mydf[], mydf[] < 0, mydf[]*0.5)

3 个答案:

答案 0 :(得分:6)

你可以这样做,

mydf[mydf<0] <- mydf[mydf<0] * 0.5

如果您有非数字值,那么您可能只想将其应用于数字值,

ind <- sapply(mydf, is.numeric)
mydf1 <- mydf[ind]
mydf1[mydf1<0] <- mydf1[mydf1<0] * 0.5
mydf[ind] <- mydf1

答案 1 :(得分:1)

您可以尝试在整个数据框中使用lapply(),然后连续替换每列。

df <- lapply(df, function(x) {
    x <- ifelse(x < 0, x*0.5, x)
})

lapply()或列表应用功能旨在用于列表,但数据框是一种特殊类型的列表,因此这适用于此。

Demo

答案 2 :(得分:0)

replace中,values参数的长度应与list中的真值数相同(&#39;索引&#39; vector

replace(mydf, mydf <0, mydf[mydf <0]*0.5)

或另一个选项是来自set的{​​{1}},这将是非常有效的

data.table

数据

library(data.table)
for(j in seq_along(mydf)){
  i1 <- mydf[[j]] < 0
  set(mydf, i = which(i1), j= j, value = mydf[[j]][i1]*0.5)
 }