遍历列表并将数据用作函数中的字符串

时间:2018-08-07 13:32:27

标签: r loops dplyr lapply

这可能是一个新手问题,但是到目前为止,我还没有找到任何简洁而可靠的答案。我可能来自python,对哲学或R的理解很差,但是我陷入了以下困境:

从数据列表中,我想要: -遍历它 -使用每次迭代作为函数的变量。

目标: 我有一些数据包来自必须添加的程序包,以便进行左连接。为了进行左连接,我在两个数据框中都应该有相同的列,这就是为什么列表将缺失的列添加到接收(左)数据框中以允许连接的原因。

那可能很重要:这些数据框是来自GenomicRanges包的GRanges对象。尽管如此,这是我过去已经遇到的问题

这是我的清单:

> ll
[1] "gc.name"   "test3" 

这是我的数据框:

> dft
DataFrame with 30 rows and 5 columns
      pvalue      qvalue meth.diff           gc.X  gc.score
   <numeric>   <numeric> <numeric>      <GRanges> <numeric>
1   2.898639e-04 0.007018699 0.2231039     MT:706-710        80
2   6.043240e-05 0.003882324 0.2243177   MT:1146-1150        80
3   9.170025e-05 0.005355496 0.1447536   MT:1986-1990        80
4   1.904443e-04 0.006558452 0.2158183   MT:2001-2005        80
5   1.899050e-04 0.006558452 0.1475142   MT:3091-3095        80
...          ...         ...       ...            ...       ...
26  0.0001936141 0.006558452 0.1865440 MT:14801-14805        40
27  0.0002909048 0.007018699 0.1306336 MT:14941-14945        40
28  0.0002731153 0.007018699 0.1362367 MT:15696-15700        60
29  0.0002383786 0.006960917 0.2309187 MT:16081-16085        80
30  0.0003304606 0.007269440 0.1783131 MT:16091-16095        20

> dfs
DataFrame with 1 row and 6 columns
    pvalue      qvalue meth.diff      gc.X     gc.name  gc.score
 <numeric>   <numeric> <numeric> <GRanges> <character> <numeric>
1 0.0002898639 0.007018699 0.2231039  MT:708:+  rs28412942         0

我的功能如下:

> ff <- function(x){dft[1,x]=dfs[1,x]}

我希望x读为ll [1],ll [2]等。

我尝试了至少两种不同的方法:apply()和%>%

  • dplyr

      

    ll%>%ff()   错误:下标包含无效名称   调用来自:.subscript_error(“下标包含无效的”,什么)

并应用:

lapply(ll,function(g){
dft[1,g]=dfs[1,g]
})

例如,我尝试使用deparse()进行某些操作,但是我仍然遇到无法将ll [1]读取为字符串的问题。

您能帮我一下,还告诉我为什么在R中使用循环对我来说是如此复杂吗? :)

最好

1 个答案:

答案 0 :(得分:0)

我看到的问题:

1)您正在尝试使用非整数索引位置对数据框进行子集化。您可以通过查找所需的整数位置来解决此问题。

dft[,which(names(dft)==g)]

2)在dft[1,g]=dfs[1,g]中,您尝试将dft中的列中的值设置为等于dfs中的列中的值,然后返回该值。这与简单地在dfs中返回该列相同,但仅在两列长度相同时才有效。这不会将事物合并在一起或更改数据框。 =将数据放入对象中,但不会改变对象的结构。

3)联接假定两个数据集中将有不同的列。联接合并一个或多个唯一键值。您无需填写任何内容即可加入。假设您要加入“ gc.name”列。您可以使用dplyr软件包连接功能。

new_dataframe <- left_join(dft,dfs)
# which in the example is the same as:
new_dataframe <- left_join(dft,dft,
     by = c("pvalue" = "pvalue",
            "qvalue" = "qvalue",
            "meth.diff" = "meth.diff",
            "gc.X" = "gc.X",
            "gc.score" = "gc.score"
           )

4)绑定是您将两个数据帧连接在一起而不合并(在另一个数据帧之上(rbind)或在另一个数据帧旁(cbind))。绑定[通常]要求列是相同的。但是,dplyr具有函数bind_rows,该函数将两个数据帧彼此绑定,并为您填写任何缺少的列。