【问题标题】:Run Functions on Multiple Columns of Multiple Data Frames在多个数据框的多列上运行函数
【发布时间】:2021-05-07 22:54:57
【问题描述】:

我有以下数据框:

a = sample(letters[1:10])
b = sample(1:1000000, 10)
c = sample(1:100000000, 10)

d = sample(letters[1:26], 10)
e = sample(1:1000000, 10)
f = sample(1:100000000, 10)

g = sample(letters[1:26], 10)
h = sample(1:1000000, 10)
i = sample(1:100000000, 10)

data = data.frame(a,b,c)
data2 = data.frame(d,e,f)
data3 = data.frame(g,h,i)




 data
              Col1   Col2     Col3
        1     a 626275 52114901
        2     j  26543 70683919
        3     c   8953   284605
        4     h 822415 35245405
        5     f 595095 81093354
        6     i 812429 71119567
        7     g 100678 87776459
        8     e  54772  9709717
        9     d  19375 43611618
        10    b 174711  7254034

data2
   Col1   Col2     Col3
1     y  12495 78654339
2     p 423945 79628767
3     k 378461 36729002
4     x 795469 98196961
5     h 240119 71903172
6     v 691621 74276314
7     d 702074 64715230
8     n 718401 21247081
9     s 580166 52888162
10    b 194630 92287079

data3
   Col1   Col2     Col3
1     m 391166 98761754
2     v 321615 71765127
3     g 959452 80114937
4     w 380126 25877104
5     f 655875 69610059
6     s 267364  7113484
7     h 391116  6801473
8     i 663616 73956544
9     o 936505 94244449
10    c 514173 82174024

我还有一个表,其中包含 Col1 列的所有内容(此表称为表 k。我想做的是编写一个函数,允许我通过以下方式对数据帧的内容进行子集化将Col1 和表k 中的所有项目识别为匹配项。

表 K:

k
   Col1
1     a
2     j
3     c
4     h
5     f
6     i
7     g
8     e
9     d
10    b
11    y
12    p
13    k
14    x
15    h
16    v
17    d
18    n
19    s
20    b
21    m
22    v
23    g
24    w
25    f
26    s
27    h
28    i
29    o
30    c

然后我只想打印列 Col2 的内容作为函数的输出。由于我有多个数据框,我知道我必须将它们放在一个列表中,然后在创建函数后使用 lapply。我已经做到了这一点,但我的代码不起作用。

get_tair = function(df, col1, col2){
  df[df[[col1]] %in% k$$Col1,]
  print(df[[col2]])
}

任何帮助表示赞赏。谢谢。

【问题讨论】:

  • 我以它为例。我使用的真实数据集在每个数据框中都缺少一些值,因此不会返回所有值。

标签: r function lapply


【解决方案1】:

我们可以将“数据”对象放在list 中并使用lapply

out_lst <- lapply(list(data, data2, data3), 
     function(dat) get_tair(dat, col1 = 'Col1', col2 = 'Col2'))

-使用的功能

get_tair = function(df, col1, col2){
   df[df[[col1]] %in% k$Col1,]

  }

【讨论】:

    【解决方案2】:

    您可以使用merge:

    get_tair = function(df, col){
      unique(merge(df, k, by.x = col, by.y = 'Col1'))
    }
    
    list_data <- list(data, data2, data3)
    lapply(list_data, function(x) get_tair(x, names(x)[1]))
    

    请注意,为 3 个数据框生成的示例数据的列与您显示的不同。 (Col1、Col2、Col3)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      • 2011-08-02
      • 1970-01-01
      • 2020-12-08
      相关资源
      最近更新 更多