我有一個由逗號分隔的字串序列組成的資料框。例如:
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
我將不勝感激任何指示和幫助解決這個問題。
謝謝!奧爾哈
uj5u.com熱心網友回復:
你可以使用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
uj5u.com熱心網友回復:
這是一個我確信會有一個超級智能應用解決方案的地方,但我會通過將df表轉換為查找表,然后加入它并進行總結來實作。
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))
uj5u.com熱心網友回復:
1)將 df2 轉換為L適合使用的命名串列eval,然后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))
uj5u.com熱心網友回復:
我們可以在呼叫中使用tidyr::separateand :rowSumsmutate
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/340005.html
下一篇:按r中的特定類別過濾
