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)