【问题标题】:selecting values from a df based on multiple percentages from a different dataframe根据来自不同数据帧的多个百分比从 df 中选择值
【发布时间】:2018-12-19 02:55:37
【问题描述】:

我正在尝试根据另一个 df 的百分比将一个 df 中的值存储到一个新的数据框中。

df1

   "seq"  "loc"  "ball" "square" "triangle"
1    abcd   b      65      12        9
2    abcd   a      0       75        0
3    ght5   a      5       10        25
4    dfsf   b      12      9         75

df2

    "Type"    "n"    "n/2"    "1/n" 
1    ball      10     50       10
2    square    9      55.5     11.1
3    triangle  6      50       16.6`

我想按“Type”存储“seq”和“loc”,让我知道它是高于(>=)“n/2”值还是低于(

output df3

     "seq" "loc" "ball" "square" "triangle"
1    abcd   b     True    NA       False
2    abcd   a     False   True     False
3    ght5   a     False   False    NA
4    dfsf   b     NA      False    True`

我使用 True/NA/False 来表示 >=/between/

当我输入此内容时,我想我可能会先复制 df1 以用作 df3,然后只存储新值来代替百分比。这似乎比选择所有内容并制作新表更容易?在那之后,我不知道该去哪里。

编辑: 目前正在玩这个,但没有运气在数据框中存储一个值。

df3 <- df1
for(i in seq_len(nrow(df2)))
{
df3[, df2$Type[i]] <- 
sapply(1:length(df2$Type), 
   function(y) sapply(df3[, df2$Type][,y], 
                 function(x) ifelse(x < df2[y, c("1/n")], "1", 
                             ifelse(x > df2[y, c("n/2")], "3", "2")) ))
}

编辑:(添加 df1 和 df2 的 dput(head))

df1
structure(list(Seq = structure(c(1L, 2L, 2L, 3L, 3L), .Label = 
c("AAAAAACCAGTCCCAGTTCGGATTG", 
"AAAAAACCAGTCTCAGTTCGGATTG", "AAAAAACCGGTCACAGTTCAGATTG"), class = 
"factor"), 
loc = structure(c(2L, 1L, 2L, 1L, 2L), .Label = c("b", 
"t"), class = "factor"), Ball = c(0, 0, 0, 0, 0), Cat = c(0, 
0, 0, 16.6666666666667, 16.6666666666667), Square = c(0, 
0, 0, 0, 0), Water = c(0, 0, 0, 33.3333333333333, 33.3333333333333
)), row.names = c(NA, -5L), class = c("grouped_df", "tbl_df", 
"tbl", "data.frame"), vars = c("Seq", "loc"), drop = TRUE, indices = 
list(
0L, 1L, 2L, 3L, 4L), group_sizes = c(1L, 1L, 1L, 1L, 1L), 
biggest_group_size = 1L, labels = structure(list(
Seq = structure(c(1L, 2L, 2L, 3L, 3L), .Label = 
c("AAAAAACCAGTCCCAGTTCGGATTG", 
"AAAAAACCAGTCTCAGTTCGGATTG", "AAAAAACCGGTCACAGTTCAGATTG"), class = 
"factor"), 
loc = structure(c(2L, 1L, 2L, 1L, 2L), .Label = c("b", 
"t"), class = "factor")), row.names = c(NA, -5L), class = "data.frame", 
vars = c("Seq", 
"loc"), drop = TRUE))

df2
dput(head(df2))
structure(list(Type = c("Ball", "Cat", "Square", "Water"), n = c(4L, 
6L, 3L, 6L), `n/2` = c(50, 50, 66.6666666666667, 50), `1/n` = c(25, 
16.6666666666667, 33.3333333333333, 16.6666666666667)), row.names = c(NA, 
-4L), class = c("tbl_df", "tbl", "data.frame"))
> 

【问题讨论】:

    标签: r


    【解决方案1】:

    您提供的dputs:

    df1 <- structure(list(Seq = structure(c(1L, 2L, 2L, 3L, 3L), .Label = 
                                     c("AAAAAACCAGTCCCAGTTCGGATTG", 
                                       "AAAAAACCAGTCTCAGTTCGGATTG", "AAAAAACCGGTCACAGTTCAGATTG"), class = 
                                     "factor"), 
                   loc = structure(c(2L, 1L, 2L, 1L, 2L), .Label = c("b", 
                                                                     "t"), class = "factor"), Ball = c(0, 0, 0, 0, 0), Cat = c(0, 
                                                                                                                               0, 0, 16.6666666666667, 16.6666666666667), Square = c(0, 
                                                                                                                                                                                     0, 0, 0, 0), Water = c(0, 0, 0, 33.3333333333333, 33.3333333333333
                                                                                                                                                                                     )), row.names = c(NA, -5L), class = c("grouped_df", "tbl_df", 
                                                                                                                                                                                                                           "tbl", "data.frame"), vars = c("Seq", "loc"), drop = TRUE, indices = 
                list(
                  0L, 1L, 2L, 3L, 4L), group_sizes = c(1L, 1L, 1L, 1L, 1L), 
              biggest_group_size = 1L, labels = structure(list(
                Seq = structure(c(1L, 2L, 2L, 3L, 3L), .Label = 
                                  c("AAAAAACCAGTCCCAGTTCGGATTG", 
                                    "AAAAAACCAGTCTCAGTTCGGATTG", "AAAAAACCGGTCACAGTTCAGATTG"), class = 
                                  "factor"), 
                loc = structure(c(2L, 1L, 2L, 1L, 2L), .Label = c("b", 
                                                                  "t"), class = "factor")), row.names = c(NA, -5L), class = "data.frame", 
                vars = c("Seq", 
                         "loc"), drop = TRUE))
    
    
    df2 <- structure(list(Type = c("Ball", "Cat", "Square", "Water"), n = c(4L, 
                                                                     6L, 3L, 6L), `n/2` = c(50, 50, 66.6666666666667, 50), `1/n` = c(25, 
                                                                                                                                     16.6666666666667, 33.3333333333333, 16.6666666666667)), row.names = c(NA, 
                                                                                                                                                                                                           -4L), class = c("tbl_df", "tbl", "data.frame"))
    

    代码之前无法正常工作,原因我不知道,但与数据框对象的class 有关。在这里,我转换为data.frame,然后sapply 代码工作正常。答案:

    library(tidyverse)
    df1 <- as.data.frame(df1)
    df2 <- as.data.frame(df2)
    
    df3 <- sapply(1:length(df2$Type), 
           function(y) sapply(df1[, df2$Type][,y], 
                              function(x) ifelse(x < df2[y, c("1/n")], "1", 
                                                 ifelse(x > df2[y, c("n/2")], "3", 
                                                        "2")) ))
    
    df3 <- df3 %>% as_data_frame %>% 
      setNames(df2$Type) %>% 
      add_column(Seq = df1[,c("Seq")], loc = df1[,c("loc")], .before = 1)
    
    df3
    # A tibble: 5 x 6
      Seq                       loc   Ball  Cat   Square Water
      <fct>                     <fct> <chr> <chr> <chr>  <chr>
    1 AAAAAACCAGTCCCAGTTCGGATTG t     1     1     1      1    
    2 AAAAAACCAGTCTCAGTTCGGATTG b     1     1     1      1    
    3 AAAAAACCAGTCTCAGTTCGGATTG t     1     1     1      1    
    4 AAAAAACCGGTCACAGTTCAGATTG b     1     2     1      2    
    5 AAAAAACCGGTCACAGTTCAGATTG t     1     2     1      2 
    

    【讨论】:

    • 我无法让您的数据集像您的数据集一样正常运行。我在上面编辑了我的帖子,以展示我现在正在使用的内容。我将您的块插入到 for 循环中。但我的输出是用 1 填充每个数据点。
    • @Steve 没有必要使用你的for 循环。 apply 系列函数是循环的矢量化版本。您只需在更改数据框特定值后运行我给您的代码。如果您提供数据集的dput 最好,我可以更改代码以适应您的具体问题。
    • 我在上面添加的 head() 会起作用吗?在 df2 上使用 dput 变得丑陋。 (几十万行。)
    • @Steve 使用 dput(head(df)).
    • 我将问题中的编辑更改为具有 dput(head) 输出。我还必须更改代码中的一部分,这导致我的百分比是字符而不是数字。不幸的是,这并没有解决我的问题。您编写的块似乎只在第一行运行。我一直试图通过添加一个 sapply 语句来改变它,但进展并不顺利。
    猜你喜欢
    • 2013-08-21
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 2019-08-20
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多