簡體   English   中英

如何將字符串轉換為數字以對 R 中的一個單元格中的值求和?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM