【问题标题】:How Do I Mutate Values Differently In Separate Columns我如何在不同的列中以不同的方式改变值
【发布时间】:2021-01-15 00:46:25
【问题描述】:

我对 R 相当陌生,我觉得这应该很简单,但我不断收到错误。我有一个名为 Master2 的数据表,其中包含在不同站点获取的几种分析物的浓度数据。我的分析物是我的列名。每列中存在多个 ND 或未检测值。我想将我的 TKN 列中的 ND 更改为 0.05,将所有其他列中的 ND 更改为 0.005。

我能够使用以下代码轻松地将框架中的所有值更改为 0.005:

Master2 % mutate_if(is.character, ~ if_else(. == "ND", "0.005", .))

在运行这行代码之前,我尝试了多种方法(替换、mutate_at...)来尝试单独更改 TKN 列中的 ND,但没有成功。以下是我的数据模型,非常感谢任何帮助!

Master2 <- structure(list(Station = c(C3A,C3A,C3A,MD10,MD10,MD10,C10A), 
Date = c(1/15/2009,1/16/2009,1/17/2009,1/18/2009,1/19/2009,1/20/2009,1/21/2009),
DissAmmonia = c(0.3,0.25,0.18,ND,1.2,0.5,0.8),
DissNitrateNitrite = c(0.6,ND,0.15,0.2,0.4,0.6,ND),
TotPhos = c(0.1,0.3,ND,0.4,0.2,0.12,0.1),
TKN = c(ND,0.2,0.13,0.5,ND,0.8,1.2)))

【问题讨论】:

  • 你能用 NA 值而不是字符串 'ND' 来表示 'ND' 吗?这将允许您使用所有内置的 NA 方法。
  • 嗨...您的dput 不可重现并会出现错误。

标签: r dplyr


【解决方案1】:

你可以这样做:

#Change 'ND' values in TKN to 0.05
Master2$TKN[Master2$TKN == 'ND'] <- 0.05
#Change 'ND' values in all other columns to 0.005
Master2[Master2 == 'ND'] <- 0.005
#Change the classes of data to respective types.
Master2 <- type.convert(Master2, as.is = TRUE)
Master2

#  Station          Date DissAmmonia DissNitrateNitrite TotPhos  TKN
#1     C3A 0.00003318401       0.300              0.600   0.100 0.05
#2     C3A 0.00003111000       0.250              0.005   0.300 0.20
#3     C3A 0.00002928000       0.180              0.150   0.005 0.13
#4    MD10 0.00002765334       0.005              0.200   0.400 0.50
#5    MD10 0.00002619790       1.200              0.400   0.200 0.05
#6    MD10 0.00002488800       0.500              0.600   0.120 0.80
#7    C10A 0.00002370286       0.800              0.005   0.100 1.20

【讨论】:

  • 我收到这两种解决方案的错误。错误:分配的数据0.005 必须与现有数据兼容。 i 列 Chla 发生错误。 x 无法将 转换为 。运行rlang::last_error() 以查看错误发生的位置。这是否意味着我需要在运行这个块之前将数据类型转换为字符?
  • @MicaelaB 你可以做两件事中的任何一件。 1)Master2是一个tibble,你可以把它转换成dataframe。 2) 或Master2[Master2 == 'ND'] &lt;- '0.005'.
  • @MicaelaB 我还注意到,到目前为止,您还没有接受您提出的问题的任何答案。请考虑从每个问题中接受一个最适合您的情况的答案。每个帖子您只能接受一个答案,但可以根据需要投票。可以参考stackoverflow.com/help/someone-answers
【解决方案2】:

如果您想坚持使用dplyr 并仍然使用mutate,请尝试:

Master2 <- Master2 %>%
  mutate(TKN = case_when(TKN == "ND" ~ 0.05, TRUE ~ TKN)) %>%
  mutate(across(select(-TKN), ~case_when(cur_column() == "ND" ~ 0.005,
                                                TRUE ~ cur_column())))

由于您没有提供可重现的示例,因此我无法测试此代码以验证是否获得了您想要的输出

【讨论】:

    【解决方案3】:

    我的代码和@Ronak Shah 的解决方案的组合似乎有效!

    #Change 'ND' values in TKN to 0.05
    Master2$TKN[Master2$TKN == 'ND'] <- 0.05
    #Change 'ND' values in all other columns to 0.005
     Master2 <- Master2 %>% 
         mutate_if(is.character, ~ if_else(. == "ND", "0.005", .)) 
    

    【讨论】:

      猜你喜欢
      • 2022-10-01
      • 2023-02-11
      • 1970-01-01
      • 2014-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-19
      • 2020-03-31
      相关资源
      最近更新 更多