我有一个巨大的数据框,在不同的列中有许多负值,应该等于它们的原始值* 0.5。 我试图应用许多R函数,但似乎我找不到一个函数来处理整个数据帧。 我想要类似下面的代码(不工作):
mydf[] <- replace(mydf[], mydf[] < 0, mydf[]*0.5)
答案 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()
或列表应用功能旨在用于列表,但数据框是一种特殊类型的列表,因此这适用于此。
答案 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)
}