【问题标题】:How can I divide several entire numbers separated by a comma in one column by numbers in another column如何将一列中用逗号分隔的几个整数除以另一列中的数字
【发布时间】:2019-05-20 14:44:11
【问题描述】:

我想用逗号分隔一列中的数字 由其他数字。 这是我的输入

> 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")) > 东风 样品1.DP 样品1.AD 样品2.DP 样品2.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,它们表示逗号两边的数字百分比,像这样:

> 结束 = 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")) >结束 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,它不起作用,因为值用逗号分隔...

你有什么想法吗?

提前感谢您的帮助

【问题讨论】:

  • 我看到了什么,还是你的输出中神奇地出现了额外的一行?
  • 嗨@lucky_luk_95,如果您分享您从现在开始尝试解决问题的方法,这对我们非常有帮助。无论如何,我认为你必须为你的号码设置小数点分隔符(看看这个post
  • @Tim Biegelesien。谢谢你是对的,我的预期输出的第一行出现了额外的一行,对不起。这是一个复制/粘贴错误。谢谢

标签: r


【解决方案1】:

您需要做的第一件事是将, 替换为. 并转换为数字。然后根据您需要的条件进行拆分并划分,即

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

【讨论】:

    【解决方案2】:

    如果您的数字中有逗号,则该列很可能已被污染并被转换为字符。您需要做的是将列转换为数字,然后分别划分每一列。

    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
    

    reprex package (v0.2.1) 于 2019 年 5 月 20 日创建

    【讨论】:

    • 我猜你把数字转换错了.....你把0,93变成93 OP只需要用.替换,就像@Sotos所做的那样并指出出自@Scipione Sarlo
    • @CodeNoob 啊,我明白了,通过将 0 推到前一个数字,我将 930 变成了 9300 和 0.93 到 93。没有意识到他们使用逗号作为小数分隔符。
    • 编辑了我的答案,将逗号作为十进制分隔符处理。
    • 感谢@dylanjm。我已经清理了我的输入。 0,930 表示 0 和 930。我没有小数点,但用逗号分隔 2 个不同的数字,这就是挑战;-)
    【解决方案3】:

    谢谢大家,但我的问题不是很清楚,非常抱歉。

    在我的输入示例中,我只有用逗号分隔的整数,没有小数。

    例如,在我的示例的第 3 行: 2,647 表示 2 和 647,我想将这两个数字除以 651 以获得结果: 2/651 、 647/651 ,因此它将是 0.01 和 0.99(或 1% 和 99%)

    它们是整数(或整数),用逗号分隔。

    希望我更清楚...谢谢...

    【讨论】:

    • 您需要创建一个示例数据框并编辑您的问题以包含它。不要只是粘贴输出,而是 1)创建一个示例数据框,我们可以轻松地将其复制/粘贴到我们的脚本中,或者 2)运行 dput(df) 其中 df 是您正在使用的当前数据框并粘贴该命令的输出进入你的问题。此外,最好不要发布您自己的问题的答案以提供更新。最好编辑您的原始问题。
    • 感谢 dylanjm,我已按照您的建议更新了帖子。谢谢
    猜你喜欢
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多