【问题标题】:Subset big data set using strings in two columns from other data set使用来自其他数据集的两列中的字符串子集大数据集
【发布时间】:2015-10-16 05:05:15
【问题描述】:

在这种情况下,我们的大数据集如下所示:

structure(list(Car = c("Mazda RX4", "Maserati Bora", "Leticia", 
                       "Hornet 4 Drive", "Hornet Sportabout", "Alex", "Duster 360", 
                       "Merc 240D", "Merc 230", "Merc 280", "Merc 280C", "Merc 450SE", 
                       "Merc 450SL", "Merc 450SLC", "Cadillac Fleetwood", "Lincoln Continental", 
                       "Chrysler Imperial", "Fiat 128", "Honda Civic", "Toyota Corolla", 
                       "Toyota Corona", "Datsun 710", "AMC Javelin", "Camaro Z28", 
                       "Datsun 710", "Fiat X1-9", "Mazda RX4", "Lotus Europa", 
                       "Ford Pantera L", "Ferrari Dino", "Mazda RX4 Wag", "Volvo 142E"
), Name = c("Mark", "Random", "Datsun 710", "Trevor", "Joanna", 
            "Valiant", "Random", "Random", "Random", "Random", "Random", 
            "Random", "Random", "Random", "Random", "Random", "Random", "Random", 
            "Random", "Trevor", "Random", "Random", "Random", "Random", "Random", 
            "Random", "Mazda RX4", "Random", "Alex", "Random", "John", "Random"
), disp = c(160, 160, 108, 258, 360, 225, 360, 146.7, 140.8, 
            167.6, 167.6, 275.8, 275.8, 275.8, 472, 460, 440, 78.7, 75.7, 
            71.1, 120.1, 318, 304, 350, 400, 79, 120.3, 95.1, 351, 145, 301, 
            121), hp = c(110, 110, 93, 110, 175, 105, 245, 62, 95, 123, 123, 
                         180, 180, 180, 205, 215, 230, 66, 52, 65, 97, 150, 150, 245, 
                         175, 66, 91, 113, 264, 175, 335, 109), drat = c(3.9, 3.9, 3.85, 
                                                                         3.08, 3.15, 2.76, 3.21, 3.69, 3.92, 3.92, 3.92, 3.07, 3.07, 3.07, 
                                                                         2.93, 3, 3.23, 4.08, 4.93, 4.22, 3.7, 2.76, 3.15, 3.73, 3.08, 
                                                                         4.08, 4.43, 3.77, 4.22, 3.62, 3.54, 4.11), wt = c(2.62, 2.875, 
                                                                                                                           2.32, 3.215, 3.44, 3.46, 3.57, 3.19, 3.15, 3.44, 3.44, 4.07, 
                                                                                                                           3.73, 3.78, 5.25, 5.424, 5.345, 2.2, 1.615, 1.835, 2.465, 3.52, 
                                                                                                                           3.435, 3.84, 3.845, 1.935, 2.14, 1.513, 3.17, 2.77, 3.57, 2.78
                                                                         ), qsec = c(16.46, 17.02, 18.61, 19.44, 17.02, 20.22, 15.84, 
                                                                                     20, 22.9, 18.3, 18.9, 17.4, 17.6, 18, 17.98, 17.82, 17.42, 19.47, 
                                                                                     18.52, 19.9, 20.01, 16.87, 17.3, 15.41, 17.05, 18.9, 16.7, 16.9, 
                                                                                     14.5, 15.5, 14.6, 18.6), vs = c(0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 
                                                                                                                     1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 
                                                                                                                     1), am = c(1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
                                                                                                                                1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1), gear = c(4, 4, 
                                                                                                                                                                                       4, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 
                                                                                                                                                                                       3, 3, 4, 5, 5, 5, 5, 5, 4), carb = c(4, 4, 1, 1, 2, 1, 4, 2, 
                                                                                                                                                                                                                            2, 4, 4, 3, 3, 3, 4, 4, 4, 1, 2, 1, 1, 2, 2, 4, 2, 1, 2, 2, 4, 
                                                                                                                                                                                                                            6, 8, 2)), .Names = c("Car", "Name", "disp", "hp", "drat", "wt", 
                                                                                                                                                                                                                                                  "qsec", "vs", "am", "gear", "carb"), row.names = c(NA, -32L), class = "data.frame")

我想通过从中提取一些行来对该数据集进行子集化。我要提取的行存储在另一个数据框中:

> dput(list_save)
structure(list(Car = c("Mazda RX4", "Mazda RX4 Wag", "Datsun 710", 
"Hornet 4 Drive", "Hornet Sportabout", "Valiant"), Name = c("Mark", 
"John", "Leticia", "Trevor", "Joanna", "Alex")), .Names = c("Car", 
"Name"), class = "data.frame", row.names = c(NA, -6L))

查看list_save,因为根据df,可以在不同的列中找到一些字符串,但也必须提取它。

所需的输出应该是这样的:

               Car       Name disp  hp drat    wt  qsec vs am gear carb
1         Mazda RX4       Mark  160 110 3.90 2.620 16.46  0  1    4    4
2     Mazda RX4 Wag       John  301 335 3.54 3.570 14.60  0  1    5    8
3           Leticia Datsun 710  108  93 3.85 2.320 18.61  1  1    4    1
4    Hornet 4 Drive     Trevor  258 110 3.08 3.215 19.44  1  0    3    1
5 Hornet Sportabout     Joanna  360 175 3.15 3.440 17.02  0  0    3    2
6              Alex    Valiant  225 105 2.76 3.460 20.22  1  0    3    1

我想到的功能类似于下面显示的:

test <- df[df[,1:2] %in% list_save, ] 

【问题讨论】:

    标签: r


    【解决方案1】:

    我会使用data.table 运行两个二元连接,一次CarName 对他们自己,一次对彼此,然后将它们组合起来。我们将为此使用 CRAN 上的最新版本 (v 1.9.6+)

    library(data.table) # v 1.9.6+
    res <- setDT(df)[list_save, on = c("Car", "Name")]
    res2 <- df[list_save, on = c(Name = "Car", Car = "Name"), nomatch = 0L]
    res[is.na(disp), (names(res)) := res2]
    #                  Car       Name disp  hp drat    wt  qsec vs am gear carb
    # 1:         Mazda RX4       Mark  160 110 3.90 2.620 16.46  0  1    4    4
    # 2:     Mazda RX4 Wag       John  301 335 3.54 3.570 14.60  0  1    5    8
    # 3:           Leticia Datsun 710  108  93 3.85 2.320 18.61  1  1    4    1
    # 4:    Hornet 4 Drive     Trevor  258 110 3.08 3.215 19.44  1  0    3    1
    # 5: Hornet Sportabout     Joanna  360 175 3.15 3.440 17.02  0  0    3    2
    # 6:              Alex    Valiant  225 105 2.76 3.460 20.22  1  0    3    1
    

    或者,更安全的方法是 rbind 仅匹配结果,但这样您将丢失原始行顺序

    res <- setDT(df)[list_save, on = c("Car", "Name"), nomatch = 0L]
    res2 <- df[list_save, on = c(Name = "Car", Car = "Name"), nomatch = 0L]
    rbind(res, res2)
    #                  Car       Name disp  hp drat    wt  qsec vs am gear carb
    # 1:         Mazda RX4       Mark  160 110 3.90 2.620 16.46  0  1    4    4
    # 2:     Mazda RX4 Wag       John  301 335 3.54 3.570 14.60  0  1    5    8
    # 3:    Hornet 4 Drive     Trevor  258 110 3.08 3.215 19.44  1  0    3    1
    # 4: Hornet Sportabout     Joanna  360 175 3.15 3.440 17.02  0  0    3    2
    # 5:           Leticia Datsun 710  108  93 3.85 2.320 18.61  1  1    4    1
    # 6:              Alex    Valiant  225 105 2.76 3.460 20.22  1  0    3    1
    

    【讨论】:

      【解决方案2】:
      sub_df <- df[which(df[,1] %in% list_save[,1] & df[,2] %in% list_save[,2]),]
      

      虽然,您的意思是在Car 中拥有Alex 和在Name 中拥有Valiant?我只是问,因为上面假设那些是错误的。如果不是这样,请使用:

      已编辑

      sub_df <-  df[which(df[,1] %in% list_save[,1] & df[,2] %in% list_save[,2] |
                          df[,1] %in% list_save[,2] & df[,2] %in% list_save[,1]),]
      

      【讨论】:

      • 我认为代码有问题。如果我将它用于我的原始数据,它会从两列中提取包含任何字符串的每一行。
      • 没有看到您的原始数据很难说,这适用于示例数据。
      • 立即尝试。编辑主要数据集。和原来的差不多。
      猜你喜欢
      • 2016-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多