[英]How to convert string to numeric to sum values in one cell in R?
我有一個數據集,每行一個單元格/列中有兩個值:
Gene Count
ACE 1,2
BRCA 3,7
HER2 100,300
我試圖將計數列的每一行中的數字與 output 相加:
Gene Count
ACE 3
BRCA 10
HER2 400
我一直在嘗試構建一些東西來獲取數值,但我不知道如何指定每行添加的值:
getnum = function(col) str_extract_all(col,"[0-9\\.-]+") %>%
lapply(.,function(x)as.numeric(x) ) %>%
unlist()
任何有關使用什么的幫助或建議將不勝感激。
輸入數據:
structure(list(Gene = c("ACE", "BRCA", "HER2"), Count = c(3L,
10L, 400L)), row.names = c(NA, -3L), class = c("data.table",
"data.frame"))
直入底座 R:
df$Count <- sapply(strsplit(df$Count, ","), function(x) sum(as.integer(x)))
df
# Gene Count
# 1 ACE 3
# 2 BRCA 10
# 3 HER2 400
數據:
df <- data.frame(
Gene = c("ACE", "BRCA", "HER2"),
Count = c("1,2", "3,7", "100,300")
)
這里有一個dplyr
的解決方案,可能不是最好的,供大家參考。
library("dplyr")
data %>%
group_by(row_number()) %>%
mutate(Count2 = sum(as.numeric(unlist(strsplit(Count, ","))))) %>%
ungroup() %>%
select(-"row_number()")
# A tibble: 3 x 3
Gene Count Count2
<chr> <chr> <dbl>
1 ACE 1,2 3
2 BRCA 3,7 10
3 HER2 100,300 400
從Count
中提取數字,轉換為 numeric 和sum
。
這可以使用stringr
來完成
sapply(stringr::str_extract_all(df$Count, '\\d+'), function(x) sum(as.integer(x)))
#[1] 3 10 400
或基礎 R:
sapply(regmatches(df$Count, gregexpr('\\d+', df$Count)), function(x) sum(as.integer(x)))
您還可以將逗號更改為加號並評估字符串:
sapply(df$Count, function(x) eval(parse(text = gsub(",", "+", x))))
library(data.table)
dt <- fread('Gene Count
ACE 1,2
BRCA 3,7
HER2 100,300')
sum_num <- function(col){
unlist(lapply(strsplit(col,","),function(x) sum(as.numeric(x))))
}
dt[,result:=sum_num(Count)][]
#> Gene Count result
#> 1: ACE 1,2 3
#> 2: BRCA 3,7 10
#> 3: HER2 100,300 400
由reprex package (v0.3.0) 於 2020 年 5 月 20 日創建
您提到將字符串轉換為數字和求和。 你已經得到了答案。 我想指出另一種可能性。
在您之前的問題中,您想生成 output 還包含用逗號分隔的項目。 答案包括直接從data.table
生成該列,以便該列實際上包含一個值列表。
如果在這種情況下,您的數據集是從data.table
類似地構建的,那么您將不會有一個帶逗號的字符串,而是一列列表。 (為方便起見,逗號顯示在打印輸出中。)
總結將是直截了當的。
library(data.table)
# create such a dataset
y <- data.table(Gene=c("ACE","BRCA","HER2"),
Count1=c(1,3,100),
Count2=c(2,7,300))
D <- y[,.(Gene=rep(Gene,2),x=c(Count1,Count2))]
D <- D[,.(Count=list(x)),by=Gene]
D
# convert Count to the sum
D[,Count:=sapply(Count,sum)]
D
也許這不適用於您的實際情況,但我想我會提到它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.