Как можно разделить несколько целых чисел, разделенных запятой в одном столбце, числами в другом столбце - PullRequest
1 голос
/ 20 мая 2019

Я хотел разделить числа, разделенные запятыми в столбце, на другие числа.Вот входные данные, которые у меня есть

> df = data.frame (SAMPLE1.DP=c("555","651","641","717"), SAMPLE1.AD=c("555", "68,583","2,639","358,359"), SAMPLE2.DP=c("1023","930","683","1179"), SAMPLE2.AD=c("1023","0,930","683","585,594"))
> df
  SAMPLE1.DP SAMPLE1.AD SAMPLE2.DP SAMPLE2.AD
1        555        555       1023       1023
2        651      68,583        930      0,930
3        641      2,639        683        683
4        717    358,359       1179    585,594

В конце я хочу добавить два новых столбца (AD / DP), которые делят значения SAMPLE1.AD по SAMPLE1.DP и SAMPLE2.AD по SAMPLE2.DP,которые представляют собой число чисел на каждой стороне запятой, например:

> end = data.frame(SAMPLE1.DP=c("555","651","641","717"),
+ SAMPLE1.AD=c("555", "68,583","204,437","358,359"),
+ SAMPLE1.AD_DP=c("1.00","0.10,0.90","0.32,0.68","0.50,0.50"),
+ SAMPLE2.DP=c("1023","930","683","1179"),
+ SAMPLE2.AD=c("1023","0,930","683","585,594"),
+ SAMPLE2.AD_DP=c("1.00","0.00,1.00","1.00","0.49,0,51"))
>end
  SAMPLE1.DP SAMPLE1.AD SAMPLE1.AD_DP SAMPLE2.DP SAMPLE2.AD SAMPLE2.AD_DP
1        555        555             1.00       1023       1023             1.00
2        651     68,583     0.10,0.90        930      0,930           0.00,1.00
3        641    204,437     0.32,0.68        683        683             1.00
4        717    358,359       0.50,0.50       1179    585,594     0.49,0,51

это означает: XX YY, ZZ YY / XX, ZZ / XX AA BB, CC BB / AA, CC / AA

Если я рассматриваю значения внутри таблицы как.numeric, это не работает, так как значения разделяются запятыми ...

Есть ли у вас идеи сделать это?

Заранее спасибо за помощь

Ответы [ 3 ]

1 голос
/ 20 мая 2019

Если в ваших числах есть запятые, столбец, скорее всего, был отравлен и представлен в виде символов.Что вам нужно сделать, это преобразовать ваши столбцы в числовые и затем разделить каждый столбец соответственно.

library(tidyverse)

dat <- tribble(~"SAMPLE1.DP",  ~"SAMPLE1.AD",  ~"SAMPLE2.DP",  ~"SAMPLE2.AD",
            555,              555,             1023,           1023,
            651,              "2,647",           930,          ",93",
            641,              "2,639",          683,           683,
            717,              "358,359",         1179,       "585,594")

dat %>% 
    mutate_at(c(2,4), list(~str_replace(., ",", "."))) %>% 
    mutate_all(as.numeric) %>% 
    mutate(addp1 = SAMPLE1.AD / SAMPLE1.DP,
           addp2 = SAMPLE2.AD / SAMPLE2.DP)
#> # A tibble: 4 x 6
#>   SAMPLE1.DP SAMPLE1.AD SAMPLE2.DP SAMPLE2.AD   addp1 addp2
#>        <dbl>      <dbl>      <dbl>      <dbl>   <dbl> <dbl>
#> 1        555     555          1023    1023    1       1    
#> 2        651       2.65        930       0.93 0.00407 0.001
#> 3        641       2.64        683     683    0.00412 1    
#> 4        717     358.         1179     586.   0.500   0.497

Создано в 2019-05-20 с помощью пакета Представить (v0.2.1)

1 голос
/ 20 мая 2019

Первое, что вам нужно сделать, это заменить , на . и привести к числовому значению. Затем разделите на основе вашего необходимого условия и разделите, т.е.

df[] <- lapply(df, function(i)as.numeric(gsub(',', '.', i)))
do.call(cbind, lapply(split.default(df, gsub('\\D+', '', names(df))), function(i) i[2] / i[1]))
#   SAMPLE1.AD SAMPLE2.AD
#1 1.000000000   1.000000
#2 0.004066052   0.001000
#3 0.004117005   1.000000
#4 0.499803347   0.496687
0 голосов
/ 21 мая 2019

Спасибо всем, но я был не очень ясен в своем вопросе, очень жаль.

В моем примере ввода у меня только целые числа, разделенные запятыми, без десятичных дробей.

Например, в строке 3 моего примера: 2,647 означает 2 И 647, и я хочу разделить оба числа на 651, чтобы получить в результате: 2/651, 647/651, поэтому это будет 0,01 и 0,99 (или 1% и 99%)

Это целые числа (или целые числа), разделенные запятыми.

Надеюсь, я прояснил ... спасибо ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...