这可能是一个新手问题,但是到目前为止,我还没有找到任何简洁而可靠的答案。我可能来自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中使用循环对我来说是如此复杂吗? :)
最好
答案 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
,该函数将两个数据帧彼此绑定,并为您填写任何缺少的列。