根据字符串 ID 对值求和
Sum values based on their string ID
我有一个由逗号分隔的字符串序列组成的数据框。例如:
df <- data.frame(patterns = c("CCDC127, HSF1, NDUFB9", "CCDC127, EXOC3, YIF1A", "EXOC3, NDUFB9, YIF1A"))
df
patterns
1 CCDC127, HSF1, NDUFB9
2 CCDC127, EXOC3, YIF1A
3 EXOC3, NDUFB9, YIF1A
我有另一个数据框,其中每个字符串对应一个数值。例如:
df2 <- data.frame(strings = c("CCDC127", "HSF1", "NDUFB9", "EXOC3", "YIF1A"),
scores = c(10, 11, 12, 13, 14))
df2
strings scores
1 CCDC127 10
2 HSF1 11
3 NDUFB9 12
4 EXOC3 13
5 YIF1A 14
我想根据第二个数据框中的值计算第一个数据框中每个模式的总和。例如:
patterns sum
1 CCDC127, HSF1, NDUFB9 33
2 CCDC127, EXOC3, YIF1A 37
3 EXOC3, NDUFB9, YIF1A 39
如果有任何指示和帮助解决这个问题,我将不胜感激。
谢谢!
奥尔哈
您可以将 strsplit
和 sapply
与 match
一起使用:
df$sum <- sapply(strsplit(df$patterns, ", "),
function(x) sum(df2$scores[match(x, df2$strings)]))
df
#> patterns sum
#> 1 CCDC127, HSF1, NDUFB9 33
#> 2 CCDC127, EXOC3, YIF1A 37
#> 3 EXOC3, NDUFB9, YIF1A 39
这是一个我确信会有超级智能应用解决方案的解决方案,但我会通过将 df
table 转换为查找 table,然后加入来实现它和总结。
df %>%
mutate(patterns2 = patterns) %>%
separate(patterns2, paste("c", 1:3)) %>%
pivot_longer(cols = paste("c", 1:3)) %>%
#end of lookup creation, now join on
right_join(df2, by = c("value" = "strings" )) %>%
group_by(patterns) %>%
summarise(scores = sum(scores))
1)将df2转换为适合与eval
一起使用的命名列表L
,然后对解析pattern
形成的每个表达式求值用加号替换逗号后。
L <- with(df2, split(scores, strings))
transform(df, sums = sapply(parse(text = gsub(",", "+", patterns)), eval, L))
给予:
patterns sums
1 CCDC127, HSF1, NDUFB9 33
2 CCDC127, EXOC3, YIF1A 37
3 EXOC3, NDUFB9, YIF1A 39
2) 另一种方法是从模式中提取单词,在 (1) 的 L 中查找它们,然后求和。
library(gsubfn)
transform(df, sums = sapply(strapply(patterns, "\w+", x ~ L[[x]]), sum))
我们可以在 mutate
调用中使用 tidyr::separate
和 rowSums
:
library(dplyr)
library(tidyr)
df%>%mutate(
sum = df %>% separate(col=patterns, sep=', +', into=paste0('pattern', 1:3))%>%
rowwise()%>%
mutate(across(everything(), ~df2$scores[df2$strings==.x]))%>%
rowSums())
patterns sum
1 CCDC127, HSF1, NDUFB9 33
2 CCDC127, EXOC3, YIF1A 37
3 EXOC3, NDUFB9, YIF1A 39
我有一个由逗号分隔的字符串序列组成的数据框。例如:
df <- data.frame(patterns = c("CCDC127, HSF1, NDUFB9", "CCDC127, EXOC3, YIF1A", "EXOC3, NDUFB9, YIF1A"))
df
patterns
1 CCDC127, HSF1, NDUFB9
2 CCDC127, EXOC3, YIF1A
3 EXOC3, NDUFB9, YIF1A
我有另一个数据框,其中每个字符串对应一个数值。例如:
df2 <- data.frame(strings = c("CCDC127", "HSF1", "NDUFB9", "EXOC3", "YIF1A"),
scores = c(10, 11, 12, 13, 14))
df2
strings scores
1 CCDC127 10
2 HSF1 11
3 NDUFB9 12
4 EXOC3 13
5 YIF1A 14
我想根据第二个数据框中的值计算第一个数据框中每个模式的总和。例如:
patterns sum
1 CCDC127, HSF1, NDUFB9 33
2 CCDC127, EXOC3, YIF1A 37
3 EXOC3, NDUFB9, YIF1A 39
如果有任何指示和帮助解决这个问题,我将不胜感激。
谢谢! 奥尔哈
您可以将 strsplit
和 sapply
与 match
一起使用:
df$sum <- sapply(strsplit(df$patterns, ", "),
function(x) sum(df2$scores[match(x, df2$strings)]))
df
#> patterns sum
#> 1 CCDC127, HSF1, NDUFB9 33
#> 2 CCDC127, EXOC3, YIF1A 37
#> 3 EXOC3, NDUFB9, YIF1A 39
这是一个我确信会有超级智能应用解决方案的解决方案,但我会通过将 df
table 转换为查找 table,然后加入来实现它和总结。
df %>%
mutate(patterns2 = patterns) %>%
separate(patterns2, paste("c", 1:3)) %>%
pivot_longer(cols = paste("c", 1:3)) %>%
#end of lookup creation, now join on
right_join(df2, by = c("value" = "strings" )) %>%
group_by(patterns) %>%
summarise(scores = sum(scores))
1)将df2转换为适合与eval
一起使用的命名列表L
,然后对解析pattern
形成的每个表达式求值用加号替换逗号后。
L <- with(df2, split(scores, strings))
transform(df, sums = sapply(parse(text = gsub(",", "+", patterns)), eval, L))
给予:
patterns sums
1 CCDC127, HSF1, NDUFB9 33
2 CCDC127, EXOC3, YIF1A 37
3 EXOC3, NDUFB9, YIF1A 39
2) 另一种方法是从模式中提取单词,在 (1) 的 L 中查找它们,然后求和。
library(gsubfn)
transform(df, sums = sapply(strapply(patterns, "\w+", x ~ L[[x]]), sum))
我们可以在 mutate
调用中使用 tidyr::separate
和 rowSums
:
library(dplyr)
library(tidyr)
df%>%mutate(
sum = df %>% separate(col=patterns, sep=', +', into=paste0('pattern', 1:3))%>%
rowwise()%>%
mutate(across(everything(), ~df2$scores[df2$strings==.x]))%>%
rowSums())
patterns sum
1 CCDC127, HSF1, NDUFB9 33
2 CCDC127, EXOC3, YIF1A 37
3 EXOC3, NDUFB9, YIF1A 39