使用 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 &lt; 10(例如)为零的所有行,但我想保留与这些行相关联的所有信息以及数据框的原始维度。

我尝试了以下方法,但这不起作用。

df[df$depth&lt;10]&lt;-0

有什么建议吗?

【问题讨论】:

请放弃使用data.frame( cbind( ... ) )的惯例。 cbind 函数创建了一个矩阵,它将所有数值强制转换为“字符”。只需使用data.frame(species,ind,hour,depth))。顺便说一句,这会奏效:df$depth[df$depth&lt;10] &lt;- 0 感谢有关cbind() 的有用提示!我想知道在df$depth 列中有NA 值(应该忽略)的情况下如何处理df$depth[df$depth&lt;10] &lt;- 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 ] &lt; 0] &lt;- NA 但这给了:Error: cannot allocate vector of size 1.8 Gb 基于@42解决方案和eth help pages尝试DF[ ,c(39, 41:42)][DF[ ,c(39, 41:42)] &lt; 0] &lt;- 'NA' 将第39、41和42列中小于0的值替换为字符串NA 如果新值是从旧值计算出来的,则此方法不起作用,例如df$depth[df$depth&lt;10] &lt;- df$depth + 3 好的,正确的是df$depth[df$depth&lt;10] &lt;- (df$depth[df$depth&lt;10] + 3)

以上是关于使用 R 中的条件替换列中的值的主要内容,如果未能解决你的问题,请参考以下文章

用 D 列中的值有条件地替换 A、B、C 列中的值

使用 dplyr 有条件地替换列中的值

Python Pandas根据多个其他列中的条件替换一列中的值[重复]

根据c =字符数替换列中的值

根据熊猫中多列的条件(最大值)替换列中的值

tidyverse 和 dplyr:根据其他列有条件地替换列中的值