在R中,对于在另一列中具有特定值的行,如何更改其中一列的值?

u3r8eeie  于 2023-02-06  发布在  其他
关注(0)|答案(2)|浏览(164)

如果用词不当的话,我很抱歉。这是一个水样中化学物质含量的数据框架。我有两列(这在我的问题中很重要),一列是阅读,另一列是单位。目前,一些单位是毫克,另一些单位是微克。我想取每一行的毫克,乘以1000,这样所有单位都是微克,这样我就不需要局里的专栏了。
Screenshot of part of the data im looking at. Look at value and unit
我试着:

fixit <- function(x){
  x*1000
}

fixit(df[df$units == 'mg/l',])

我也尝试过使用过滤器和for循环来代替fixit函数,但是我想不出其他的方法。

yvfmudvl

yvfmudvl1#

您可以使用ifelse():

## create example data
set.seed(832479)
df = data.frame(value=runif(10), unit=sample(c("mg/l","ug/l"), 10, replace=T))

       value unit
1  0.3265564 mg/l
2  0.6617228 mg/l
3  0.3592905 mg/l
4  0.4203186 ug/l
5  0.8636146 ug/l
6  0.2278049 mg/l
7  0.3608057 ug/l
8  0.8555797 mg/l
9  0.6580872 ug/l
10 0.9925924 ug/l

## now do the conversion for the "mg/l" values
df$converted = ifelse(df$unit=="mg/l", df$value*1000, df$value)

       value unit   converted
1  0.3265564 mg/l 326.5563531
2  0.6617228 mg/l 661.7227946
3  0.3592905 mg/l 359.2905267
4  0.4203186 ug/l   0.4203186
5  0.8636146 ug/l   0.8636146
6  0.2278049 mg/l 227.8049409
7  0.3608057 ug/l   0.3608057
8  0.8555797 mg/l 855.5796870
9  0.6580872 ug/l   0.6580872
10 0.9925924 ug/l   0.9925924

这就是你要找的吗

yuvru6vn

yuvru6vn2#

我们可能需要使用逻辑索引对value进行子集化,并对该子集应用fixit函数

i1 <- df$units == 'mg/l'
df$value[i1] <- fixit(df$value[i1])

相关问题