【问题标题】:R print values in new column based on the values in two other columnsR根据其他两列中的值在新列中打印值
【发布时间】:2016-02-02 00:07:27
【问题描述】:

我正在尝试根据其他两列(file_name 和 Morph)中的值创建一列 (H2f_back)。当每个文件名的 Morph=B 时,我希望 H2f_MEAN 的值粘贴到 H2f_back 中。

对于给定的数据表(“数据”),这将导致如下结果:

file_name,  H2f_MEAN,   Morph,  H2f_back  
6052_1, 0.14,   B,  0.14  
6052_1, 0.22,   C,  0.14  
6052_2, 0.34,   C,  0.41  
6052_2, 0.41,   B,  0.41  
6052_3, 0.53,   M,  0.01
6052_3, 0.01,   B,  0.01

这段代码:

df<-read.csv("~/Desktop/IODP/EXP_337/SIMS/test.csv", header=TRUE)
df<-data.frame(df, stringsAsFactors = FALSE)
df %>% group_by(file_name, cumsum(Morph == 'background')) %>% mutate(H2f_back = H2f_MEAN[Morph == 'background']) %>% ungroup() %>% select(-4)

导致此错误:
错误:大小不兼容 (%d),需要 %d(组大小)或 1

【问题讨论】:

  • df&lt;-data.frame(df, stringsAsFactors = FALSE) 线路在做什么?读取数据时不能指定stringsAsFactors = FALSE吗?

标签: r dplyr


【解决方案1】:

这对我有用,因为 csv 文件中有以下数据

file_name,H2f_MEAN,Morph
6052_1,0.14,B
6052_1,0.22,C
6052_2,0.34,C
6052_2,0.41,B
6052_3,0.53,M
6052_3,0.01,B

使用 readr 进行文件输入,而不是基本 R 函数。

library(readr)
library(dplyr)
read_csv("~/elizr_error.csv")
df %>% group_by(file_name) %>% mutate(H2f_back = H2f_MEAN[Morph == 'B'])

file_name H2f_MEAN Morph H2f_back
  (chr)    (dbl) (chr)    (dbl)
6052_1     0.14     B     0.14
6052_1     0.22     C     0.14
6052_2     0.34     C     0.41
6052_2     0.41     B     0.41
6052_3     0.53     M     0.01
6052_3     0.01     B     0.01

编辑:如果存在没有“B”条件的文件,您可以尝试以下操作,如果未找到 B,则将值设置为 0.0

df %>% group_by(file_name) %>% mutate(H2f_back = ifelse('B' %in% Morph, H2f_MEAN[Morph == 'B'], 0.0))

【讨论】:

    【解决方案2】:

    您可以在给定的输入上使用dplyr,如下所示:

    输入数据:

    df
      file_name H2f_MEAN Morph
    1         1        1     B
    2         1        2     C
    3         1        3     C
    4         4        4     B
    5         4        5     M
    

    file_name 分组并将Morph 等于B 的行的H2f_MEAN 分配给结果列(注意:您可以按此处所示的多个变量进行分组):

    df %>% group_by(file_name) %>% mutate(H2f_back = H2f_MEAN[Morph == 'B'])
    

    导致输出:

    df
    Source: local data frame [5 x 4]
    
      file_name H2f_MEAN Morph H2f_back
          (int)    (dbl) (chr)    (dbl)
    1         1     0.14     B     0.14
    2         1     0.22     C     0.14
    3         1     0.34     C     0.14
    4         4     0.41     B     0.41
    5         4     0.53     M     0.41
    

    【讨论】:

    • 您将如何修改以根据 file_name 和 Morph 的分组打印 H2f_MEAN 中的值? H2f_MEAN 和 file_name 中的数字在我之前的示例中是相同的,所以不清楚这是我的最终目标。谢谢!
    • 我根据您修改后的输入/输出示例更新了答案。希望这会有所帮助。
    • 谢谢!对于字符串文件名,这有什么不同的原因吗?您的解决方案非常适用于示例表,但是当我使用我的实际数据表时,它会给出错误“错误:大小不兼容 (%d),期望 %d(组大小)或 1” - 前几行粘贴在下面。文件名 H2f_MEAN 变形 1 6052_2 0.00 coccoid 2 6052_2 0.00 coccoid 3 6052_2 0.00 背景
    • 确保使用 stringsAsFactors = FALSE 读取数据。很可能存在产生问题的因素水平。顺便说一句 - 最好用完全具​​有代表性的输入数据样本来提问。否则,很难提供工作代码。
    • 将表格修改为产生错误的表格。添加 stringsAsFactors = FALSE 似乎没有帮助。抱歉,没有先包含这个,但是整个数据集很大,不确定要包含什么!再次感谢!
    猜你喜欢
    • 2022-07-05
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 2021-10-19
    • 2022-01-23
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    相关资源
    最近更新 更多