使用 R 中的条件替换列中的值
Posted
技术标签:
【中文标题】使用 R 中的条件替换列中的值【英文标题】:Replacing values from a column using a condition in R 【发布时间】:2012-12-02 00:53:59 【问题描述】:我有一个非常基本的R
问题,但我很难找到正确的答案。我有一个如下所示的数据框:
ind<-rep(1:4,each=24)
hour<-rep(seq(0,23,by=1),4)
depth<-runif(length(ind),1,50)
df<-data.frame(cbind(species,ind,hour,depth))
df$depth<-as.numeric(df$depth)
我希望它选择并替换 depth < 10
(例如)为零的所有行,但我想保留与这些行相关联的所有信息以及数据框的原始维度。
我尝试了以下方法,但这不起作用。
df[df$depth<10]<-0
有什么建议吗?
【问题讨论】:
请放弃使用data.frame( cbind( ... ) )
的惯例。 cbind
函数创建了一个矩阵,它将所有数值强制转换为“字符”。只需使用data.frame(species,ind,hour,depth))
。顺便说一句,这会奏效:df$depth[df$depth<10] <- 0
感谢有关cbind()
的有用提示!我想知道在df$depth
列中有NA
值(应该忽略)的情况下如何处理df$depth[df$depth<10] <- 0
?
【参考方案1】:
我是通过谷歌搜索来到这里的,因为我的其他代码很“整洁”,所以将“整洁”的方式留给其他可能觉得有用的人
library(dplyr)
iris %>%
mutate(Species = ifelse(as.character(Species) == "virginica", "newValue", as.character(Species)))
【讨论】:
【参考方案2】:# reassign depth values under 10 to zero
df$depth[df$depth<10] <- 0
(对于作为因子的列,您只能分配作为因子级别的值。如果您想分配当前不是因子级别的值,则需要先创建附加级别:
levels(df$species) <- c(levels(df$species), "unknown")
df$species[df$depth<10] <- "unknown"
【讨论】:
是否可以将此解决方案调整为可同时用于多个列的解决方案?我试过df [ -charcol ] [ df [ -charcol ] < 0] <- NA
但这给了:Error: cannot allocate vector of size 1.8 Gb
。
基于@42解决方案和eth help pages尝试DF[ ,c(39, 41:42)][DF[ ,c(39, 41:42)] < 0] <- 'NA'
将第39、41和42列中小于0的值替换为字符串NA
如果新值是从旧值计算出来的,则此方法不起作用,例如df$depth[df$depth<10] <- df$depth + 3
好的,正确的是df$depth[df$depth<10] <- (df$depth[df$depth<10] + 3)
以上是关于使用 R 中的条件替换列中的值的主要内容,如果未能解决你的问题,请参考以下文章