使用R从具有相同标识符的所有行中减去行

时间:2017-04-26 14:49:56

标签: r group-by dplyr

我对R和编程/脚本编程一般都是新手(因此也是SO)。如果问题不完美,请原谅我。我可能也缺少更先进的R-people的一些“词汇”:)

我想要做的是,从共享公共标识符的数据帧中的a中的所有其他数据中减去数据帧的行中的值。 我在R中找到了内置的Theoph数据集,我可以用它来进一步解释我想要做什么(这对于这个特定的数据集没有任何生物学意义,但是更容易发布我的实际数据)。

我想从所有其他conc值中减去属于时间0.00的conc值。这应该针对每个主题单独进行。我首先通过提取其中一个主题的数据来尝试这个。这可以使用以下代码:

# using a part (only one subject) of the built-in Theoph dataset
test2 <- subset(Theoph, Theoph$Subject=="1") 
test2 <- mutate(test2, diffconc = conc - subset(test2$conc, test2$Time==0.00))

现在我想为所有科目做同样的事情。我尝试使用dplyr的group_by函数并按Subject分组,然后将其与mutate()组合。见下文:

# trying it with the whole built-in Theoph dataset (for every subject individually) 
Theoph %>%   group_by(Subject) %>%   mutate(diffconc = conc - subset(Theoph$conc, Theoph$Time==0.00)) -> test3

但这不符合我的预期。我不确定如何正确索引,它是由主题完成的。

2 个答案:

答案 0 :(得分:0)

在这个mutate语句中:

Theoph %>%   
group_by(Subject) %>%   
mutate(diffconc = conc - subset(Theoph$conc, Theoph$Time==0.00))

您的subset操作整个Theoph数据框,绕过您的group_by语句:它在整个数据框中搜索时间== 0,而不是仅在每个主题中搜索,因此它会找到所有时间实例== 0。

这就是为什么当你提取一个Subject(只有一个Time == 0的实例)时它可以工作,但是当你在group_by之后使用相同的代码时却不行。

以下内容可行,假设每个主题始终只有一个时间== 0:

Theoph %>%
group_by(Subject) %>%   
mutate(diffconc = conc - conc[Time==0])

答案 1 :(得分:0)

如果我理解正确,你可以试试:

transmute(
  left_join(Theoph,
          rename(
            select(
              filter(Theoph,Time==0.00),
              Subject,conc),
            conc0=conc),
          by="Subject"),
  Subject,Wt,Dose,Time,conc,diffconc=conc-conc0)