gpt4 book ai didi

R data.table - 如何找到一个整数值并将后续列的值相乘?

转载 作者:行者123 更新时间:2023-12-01 23:49:02 26 4
gpt4 key购买 nike

假设在 R 中定义了以下 data.table

Drug1   Dose1   Freq1   Drug2   Dose2   Freq2   Drug3   Dose3   Freq3
1234567890 2 1 1548768954 23 2 2222132435 2 2
4356678344 2 2 6547894356 3 1 2123456789 2 2
5673452976 4 1 1234567890 4 0.5 4568789076 33 4

如何仅在“Drug1”-“Drug[x]”列中搜索特定整数值,如果找到,则创建一个新变量,该变量是以下两列值的乘积,对应于找到整数值的同一行(此新变量中的所有其他值应为 NA)?

注意:“药物[x]”列中的整数值的长度均为 10(例如 1234567890、4593480033 等),感兴趣的搜索词的长度仅为 5,从前 5 位数字开始整数(例如 12345、45934 等)。

因此,如果我的搜索词是整数值 12345,结果将如下所示:

Drug1   Dose1   Freq1   Newvar1 Drug2   Dose2   Freq2   Newvar2 Drug3   Dose3   Freq3
1234567890 2 1 2 1548768954 23 2 NA 2222132435 2 2
4356678344 2 2 NA 6547894356 3 1 NA 2123456789 2 2
5673452976 4 1 NA 1234567890 4 0.5 -2 4568789076 33 4

谢谢。

最佳答案

你可以试试 Map

v1 <- grep("Drug", colnames(df))
m1 <- matrix(sort(v1+rep(1:2,each=3)),ncol=3)
df[paste0('NewVar',1:3)] <- Map(function(x,y) {
x1 <-substr(df[,x],1,5)==12345
Reduce(`*`,df[y]*(NA^!x1))}, v1, split(m1, col(m1)))
df
# Drug1 Dose1 Freq1 Drug2 Dose2 Freq2 Drug3 Dose3 Freq3 NewVar1
#1 1234567890 2 1 1548768954 23 2.0 2222132435 2 2 2
#2 4356678344 2 2 6547894356 3 1.0 2123456789 2 2 NA
#3 5673452976 4 1 1234567890 4 0.5 4568789076 33 4 NA
# NewVar2 NewVar3
#1 NA NA
#2 NA NA
#3 2 NA

更新

也许你可以尝试使用 data.tablefor 循环

 library(data.table)
DT <- as.data.table(df)
nm1 <- grep('Drug', colnames(DT))
nm2 <- lapply(nm1, function(x) c(x+1,x+2))
nm3 <- paste0('NewVar', seq_along(nm1))

for(j in seq_along(nm1)){
DT[, (nm3[j]):= Reduce(`*`,DT[,nm2[[j]],with=FALSE
]*NA^!substr(DT[[nm1[j]]],1,5)==12345)]
}

DT
# Drug1 Dose1 Freq1 Drug2 Dose2 Freq2 Drug3 Dose3 Freq3 NewVar1
#1: 1234567890 2 1 1548768954 23 2.0 2222132435 2 2 2
#2: 4356678344 2 2 6547894356 3 1.0 2123456789 2 2 NA
#3: 5673452976 4 1 1234567890 4 0.5 4568789076 33 4 NA
# NewVar2 NewVar3
#1: NA NA
#2: NA NA
#3: 2 NA

或者使用@nicola 的方法根据 index 数字稍微改变替代方案

 DT <- as.data.table(df)
indx <- 1:3
for(j in indx){
DT[, (paste0('NewVar', j)):= DT[[paste0("Dose",j)]]*
DT[[paste0("Freq",j)]]*(NA^!substr(DT[[paste0("Drug",j)]],1,5)==12345)]
}
DT
# Drug1 Dose1 Freq1 Drug2 Dose2 Freq2 Drug3 Dose3 Freq3 NewVar1
#1: 1234567890 2 1 1548768954 23 2.0 2222132435 2 2 2
#2: 4356678344 2 2 6547894356 3 1.0 2123456789 2 2 NA
#3: 5673452976 4 1 1234567890 4 0.5 4568789076 33 4 NA
# NewVar2 NewVar3
#1: NA NA
#2: NA NA
#3: 2 NA

数据

df <- structure(list(Drug1 = c(1234567890, 4356678344, 5673452976), 
Dose1 = c(2L, 2L, 4L), Freq1 = c(1L, 2L, 1L), Drug2 = c(1548768954,
6547894356, 1234567890), Dose2 = c(23L, 3L, 4L), Freq2 = c(2,
1, 0.5), Drug3 = c(2222132435, 2123456789, 4568789076), Dose3 = c(2L,
2L, 33L), Freq3 = c(2L, 2L, 4L)), .Names = c("Drug1", "Dose1",
"Freq1", "Drug2", "Dose2", "Freq2", "Drug3", "Dose3", "Freq3"
), class = "data.frame", row.names = c(NA, -3L))

关于R data.table - 如何找到一个整数值并将后续列的值相乘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27542621/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com