R 对datatable中的两列进行成对操作,并用新列替换它们';姓名

R 对datatable中的两列进行成对操作,并用新列替换它们';姓名,r,shiny,data.table,R,Shiny,Data.table,假设我有一个大数据表,如下所示: 序列A1 B1 A2 B2 中一○二九一一 s2 1 3 2 s3 2 4 1 s4 3 5 4 14 s5 3 7 2 0 中六0 2 8 5 . . . . . . . . . . . . . . . 我想对它计算一些操作,比如log2(A2/A1)和log2(B2/B1),然后返回列名为“A2/A1”和“B2/B1”的数据表,如下所示: 序列A2/A1 B2/B

假设我有一个大数据表,如下所示:

序列A1 B1 A2 B2
中一○二九一一
s2 1 3 2
s3 2 4 1
s4 3 5 4 14
s5 3 7 2 0
中六0 2 8 5
.          .   .   .    .
.          .   .   .    .
.          .   .   .    .

我想对它计算一些操作,比如log2(A2/A1)和log2(B2/B1),然后返回列名为“A2/A1”和“B2/B1”的数据表,如下所示:

序列A2/A1 B2/B1
s1日志2(9/0)日志2(11/2)
s2日志2(3/1)日志2(2/3)
s3日志2(4/2)日志2(1/2)
s4日志2(4/3)日志2(14/5)
s5 log2(2/3)log2(0/7)
s6日志2(8/0)日志2(5/2)

我已经找到了一个解决办法,但效果不错。由于列的选择是动态进行的(在UI中),我不能真正使用它,我仍然得到所有列(A1、B1、A2、B2和A2/A1 B2/B1)

Hier是我的解决方法:

input_table <<- getData()[, paste(input$secondSelection, input$firstSelection,sep= "/"):=
list(get(input$secondSelection[1])/get(input$firstSelection[1]),
get(input$secondSelection[2])/get(input$firstSelection[2]))]

input\u table我们可以使用
set
功能,这将有助于执行此操作。从原始数据集中创建第一列为“序列”的结果数据集(“res”),其中两列由NA占用。然后,
通过循环“j1”中指定的索引来设置这些列中的值,将“dt1”中的列子集,除以并取
log2

res <- data.table(Sequence = dt1$Sequence, A2A1= NA_real_, B2B1=NA_real_)
j1 <- as.integer(seq_len(uniqueN(sub("\\d+", "", names(dt1)[-1]))) + 1)

for(j in j1){
  set(res, i = NULL, j= j, value = log2(dt1[[j+2]]/dt1[[j]]))
}
res
#    Sequence       A2A1       B2B1
#1:       s1        Inf  2.4594316
#2:       s2  1.5849625 -0.5849625
#3:       s3  1.0000000 -1.0000000
#4:       s4  0.4150375  1.4854268
#5:       s5 -0.5849625       -Inf
#6:       s6        Inf  1.3219281

log2(9/0)
#[1] Inf
log2(11/2)
#[1] 2.459432

res它取决于上传的文件。但是,由于用户选择要计算的列,我可以使用“length(input$firstSelection)”从所选列中得到它,我甚至在做任何事情之前检查它是否匹配length(input$secondSelection)。如果这些列具有类似的交替顺序,那么您可以使用下面的解决方案,这正是我不想做的。。。正如我所说的,如果列的数量改变,我也必须改变代码。由于用户可以上传任何文件,我没有机会对此做出反应。不过,谢谢你回答我说的。。。你的回答现在对我没什么帮助。我宁愿坚持我的变通方法。
res <- data.table(Sequence = dt1$Sequence, A2A1= NA_real_, B2B1=NA_real_)
j1 <- as.integer(seq_len(uniqueN(sub("\\d+", "", names(dt1)[-1]))) + 1)

for(j in j1){
  set(res, i = NULL, j= j, value = log2(dt1[[j+2]]/dt1[[j]]))
}
res
#    Sequence       A2A1       B2B1
#1:       s1        Inf  2.4594316
#2:       s2  1.5849625 -0.5849625
#3:       s3  1.0000000 -1.0000000
#4:       s4  0.4150375  1.4854268
#5:       s5 -0.5849625       -Inf
#6:       s6        Inf  1.3219281

log2(9/0)
#[1] Inf
log2(11/2)
#[1] 2.459432
dt1 <- structure(list(Sequence = c("s1", "s2", "s3", "s4", "s5", "s6"
 ), A1 = c(0L, 1L, 2L, 3L, 3L, 0L), B1 = c(2L, 3L, 2L, 5L, 7L, 
 2L), A2 = c(9L, 3L, 4L, 4L, 2L, 8L), B2 = c(11L, 2L, 1L, 14L, 
 0L, 5L)), .Names = c("Sequence", "A1", "B1", "A2", "B2"), 
 class = "data.frame", row.names = c(NA, -6L))
setDT(dt1)