R 计算行中多个值的总和
嗨,我有一个i/p数据框,如下所示R 计算行中多个值的总和,r,R,嗨,我有一个i/p数据框,如下所示 df = data.frame('value' = c("(1_00),(0_04),(1_08),(0_12),(1_14)","(1_15),(0_22),(1_29)", "(0_30),(1_38),(0_40),(1_44)","(0_45),(1_57),(0_59)", "(0_15),(1_21),(0_26),(0_29)"),st
df = data.frame('value' = c("(1_00),(0_04),(1_08),(0_12),(1_14)","(1_15),(0_22),(1_29)",
"(0_30),(1_38),(0_40),(1_44)","(0_45),(1_57),(0_59)",
"(0_15),(1_21),(0_26),(0_29)"),stringsAsFactors = F)
for row:1- i.e `(1_00),(0_04),(1_08),(0_12),(1_14)` calculated as second set
of character in second block after "_" (04) minus second set (00) in the first
block multply by first set in first block (i.e: (4-0)*1 )
similarly from 3rd block to 2nd block .finally we need need to add all blocks.`(4-0)*1 + (8-4)*0 +(12-8)*1 + (14-12)*0`
从上面的数据框中,我无法找到“样本计算”列中的“输出”列
“样本计算”的计算如下所示
df = data.frame('value' = c("(1_00),(0_04),(1_08),(0_12),(1_14)","(1_15),(0_22),(1_29)",
"(0_30),(1_38),(0_40),(1_44)","(0_45),(1_57),(0_59)",
"(0_15),(1_21),(0_26),(0_29)"),stringsAsFactors = F)
for row:1- i.e `(1_00),(0_04),(1_08),(0_12),(1_14)` calculated as second set
of character in second block after "_" (04) minus second set (00) in the first
block multply by first set in first block (i.e: (4-0)*1 )
similarly from 3rd block to 2nd block .finally we need need to add all blocks.`(4-0)*1 + (8-4)*0 +(12-8)*1 + (14-12)*0`
o/p df1
df1 = data.frame('value' = c("(1_00),(0_04),(1_08),(0_12),(1_14)",
"(1_15),(0_22),(1_29)",
"(0_30),(1_38),(0_40),(1_44)",
"(0_45),(1_57),(0_59)","(1_00),(0_07),(1_14)",
"(0_15),(1_21),(0_26),(0_29)"),
"sample_calc"=c("(4-0)*1 + (8-4)*0 +(12-8)*1 + (14-12)*0",
"(22-15)*1 + (29-22)*0",
"(38-30)*0 + (40-38)*1 + (44-40)*0",
"(57-45)*0 + (59-57)*1",
"(7-0)*1 + (14-7)*0",
"(21-15)*0 + (26-21)*1 + (29-26)*0"),
"output"=c(8,7,2,2,7,5),stringsAsFactors = F)
首先,我将使用以下代码将字符串转换为数字字符串:
foo <- lapply(strsplit(gsub("\\(|\\)", "", df$value), ","),
function(x) as.numeric(unlist(strsplit(x, "_"))))
接下来,我们只需要对foo
的子列表应用您的计算(我们得到“第二个集合”中元素的“id”(y
)并应用所需的逻辑:sum((x[y]-x[y-2])*x[y-3])
)
sapply(foo,函数(x){yprocess.df.column下面是一个基本的R解决方案:
df$output <-
sapply(strsplit(gsub('[()]','',df$value),'[_,]'),
function(x) {
x<-as.numeric(x)
sum(-x[!seq_along(x)%%2]*diff(c(0,head(x[!!seq_along(x)%%2],-1),0)))})
# df
# value output
# 1 (1_00),(0_04),(1_08),(0_12),(1_14) 8
# 2 (1_15),(0_22),(1_29) 7
# 3 (0_30),(1_38),(0_40),(1_44) 2
# 4 (0_45),(1_57),(0_59) 2
# 5 (0_15),(1_21),(0_26),(0_29) 5
问题很清楚(或多或少),OP提供了可复制的示例和想要的输出。关闭将过于苛刻。比我的解决方案更好。;)
df$output <-
sapply(strsplit(gsub('[()]','',df$value),'[_,]'),
function(x) {
x<-as.numeric(x)
sum(-x[!seq_along(x)%%2]*diff(c(0,head(x[!!seq_along(x)%%2],-1),0)))})
# df
# value output
# 1 (1_00),(0_04),(1_08),(0_12),(1_14) 8
# 2 (1_15),(0_22),(1_29) 7
# 3 (0_30),(1_38),(0_40),(1_44) 2
# 4 (0_45),(1_57),(0_59) 2
# 5 (0_15),(1_21),(0_26),(0_29) 5
library(tidyverse)
df %>%
rowid_to_column() %>%
separate_rows(value,sep=",") %>%
mutate_at("value",~gsub('[()]','',.x)) %>%
separate(value,c("a","b"),convert = T) %>%
group_by(rowid) %>%
mutate_at("a",~-diff(c(0,.x[-length(.x)],0))) %>%
summarize(output = sum(a*b)) %>%
select(-rowid) %>%
cbind(df,.)
# value output
# 1 (1_00),(0_04),(1_08),(0_12),(1_14) 8
# 2 (1_15),(0_22),(1_29) 7
# 3 (0_30),(1_38),(0_40),(1_44) 2
# 4 (0_45),(1_57),(0_59) 2
# 5 (0_15),(1_21),(0_26),(0_29) 5