1

我有一个看起来像这样的数据表,

我基本上想做的是在表格中创建一个新列,其中包含每个样本的“读数”中的倍数变化,例如,

第 0 周的样品 1/第 0 周的样品 1

第 4 周的样品 1/第 0 周的样品 1

第 14 周的样品 1/第 0 周的样品 1

以此类推,以此类推样品 1 的所有时间点,然后使用来自第 0 周的它们各自的“读数”为我的其余样品计算相同的东西。

到目前为止,我尝试过的内容大致是,

r
SampleIDs<-as.character(unique(table$ID))

table$FC<-for(i in table[i,]){
for(j in SampleIDs){

if(table[i,"ID"]==j){

    table[i,3]/table[(("WEEK"==0)&("ID"==j)),3]
    }
    }
  }

}

运行时,代码返回错误,

Error in if (table[i, "SampleID"] == j) { : argument is of length zero

我试图做的是创建一个具有唯一 ID 的单独向量,并在 for 函数中使用它来逐行确保该行包含具有相同 ID 的样本,然后尝试检索该单元格包含 ID 为 j 且来自第 0 周的样本的数据,计算我的倍数变化值。任何有关如何做到这一点的帮助将不胜感激!谢谢

4

2 回答 2

0

for对于需要按组执行的操作,不应使用循环。有一些函数可以帮助您执行此类分组计算。

如果数据尚未按 排序WEEK,您可以先执行此操作。

df <- df1[with(df1, order(ID, WEEK)),]

然后除以readout每组中的第一个值。

这可以在基础 R 中完成:

df$result <- with(df, readout/ave(readout, ID, FUN = function(x) x[1]))

dplyr

library(dplyr)
df %>% group_by(ID) %>% mutate(result = readout/first(readout))

data.table

library(data.table)
setDT(df)[, result := readout/first(readout), ID]
于 2020-06-09T00:58:31.817 回答
0

可能是,我们可以按“ID”分组并通过将“读数”除以“读数”来创建一个新列,其中“周”为 0

library(dplyr)
df1 %>% 
    group_by(ID) %>% 
    mutate(new = readout/readout[WEEK == 0])

如果“WEEK”已被订购

df1 %>%
    group_by(ID) %>%
    mutate(new = readout/readout[1])

或与data.table

library(data.table)
setDT(df1)[, new := readout/readout[WEEK == 0], by = ID]

如果已经订购

setDT(df1)[, new := readout/readout[1], by = ID]

或使用base R

df1$new <- with(df1, readout/setNames(readout[WEEK == 0], unique(ID))[ID])

关于控制台显示+,它只是一个表示表达式不完整的符号。

在此处输入图像描述

这我们也可以在其他控制台中获得,例如在 Julia 中,REPL 不会显示任何符号,但会在完整表达式完成后给出输出

在此处输入图像描述

数据

df1 <- structure(list(ID = c(1L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 3L), 
    WEEK = c(0, 4, 14, 24, 0, 4, 0, 4, 14, 24), readout = c(5, 
    6, 7, 8, 1, 1.5, 1, 1, 5, 3)), class = "data.frame", row.names = c(NA, 
-10L))
于 2020-06-09T00:37:02.713 回答