r - R将多列分成列表
问题描述
我尝试编写一个函数将列分隔到每个数据框中,同时将前四列和每个样本保留在数据框中。以下是示例:
df:
Name RsID Chr Position Sample1 Sample2 Sample3 Sample4 Sample5 Sample6 Sample7
200610-1 rs423874 MT 2755 AA AA AA AA AA AA AA
200610-10 rs94753345 MT 0 AA AA AA AA AA AA AA
200610-100 rs36757 MT 15172 GG GG GG GG GG GG GG
200610-102 rs1444029 MT 125 AA AA AA AA AA AA AA
200610-105 rs3796687 MT 236 AA AA TT AA AA AT AA
200610-107 rs483795 MT 482 TT AA AA TT AA AA AA
desired output:
Name RsID Chr Position Sample1
200610-1 rs423874 MT 2755 AA
200610-10 rs94753345 MT 0 AA
200610-100 rs36757 MT 15172 GG
200610-102 rs1444029 MT 125 AA
200610-105 rs3796687 MT 236 AA
200610-107 rs483795 MT 482 TT
Name RsID Chr Position Sample2
200610-1 rs423874 MT 2755 AA
200610-10 rs94753345 MT 0 AA
200610-100 rs36757 MT 15172 GG
200610-102 rs1444029 MT 125 AA
200610-105 rs3796687 MT 236 AA
200610-107 rs483795 MT 482 AA
...
code:
sep_col <- function(df,i) {if (length(i) <= 1) { x <- cbind(df[1:4],df[i])}
else { x <- list()
for(s in 1:length(i)) {y <- cbind(df[1:4],df[i[s]])
x[[s]] <- list(y)}}
return(x)}
如果我在函数内写 df[1:4] 它可以工作,但是如果我只在函数中改回 df 并运行,则会出现错误:
sep_col(df[1:4],6)
Error:
Error in `[.data.frame`(df, i) : undefined columns selected
Called from: `[.data.frame`(df, i)
我不知道为什么它不正确,但是两个类都是'data.frame',所以任何人都可以提出建议,谢谢。
解决方案
我们可以使用Map
将 1:4 列分别与第 5 到 11 列中的每一个绑定,names
并将相应列的setNames
Map(function(x, y, z) cbind(x, setNames(list(y), z)),
list(df[1:4]), df[5:11], names(df)[5:11])
#[[1]]
# Name RsID Chr Position Sample1
#1 200610-1 rs423874 MT 2755 AA
#2 200610-10 rs94753345 MT 0 AA
#3 200610-100 rs36757 MT 15172 GG
#4 200610-102 rs1444029 MT 125 AA
#5 200610-105 rs3796687 MT 236 AA
#[[2]]
# Name RsID Chr Position Sample2
#1 200610-1 rs423874 MT 2755 AA
#2 200610-10 rs94753345 MT 0 AA
#3 200610-100 rs36757 MT 15172 GG
#4 200610-102 rs1444029 MT 125 AA
#5 200610-105 rs3796687 MT 236 AA
#[[3]]
# Name RsID Chr Position Sample3
#1 200610-1 rs423874 MT 2755 AA
#2 200610-10 rs94753345 MT 0 AA
#3 200610-100 rs36757 MT 15172 GG
#4 200610-102 rs1444029 MT 125 AA
#5 200610-105 rs3796687 MT 236 TT
#[[4]]
# Name RsID Chr Position Sample4
#1 200610-1 rs423874 MT 2755 AA
#2 200610-10 rs94753345 MT 0 AA
#3 200610-100 rs36757 MT 15172 GG
#4 200610-102 rs1444029 MT 125 AA
#5 200610-105 rs3796687 MT 236 AA
#[[5]]
# Name RsID Chr Position Sample5
#1 200610-1 rs423874 MT 2755 AA
#2 200610-10 rs94753345 MT 0 AA
#3 200610-100 rs36757 MT 15172 GG
#4 200610-102 rs1444029 MT 125 AA
#5 200610-105 rs3796687 MT 236 AA
#[[6]]
# Name RsID Chr Position Sample6
#1 200610-1 rs423874 MT 2755 AA
#2 200610-10 rs94753345 MT 0 AA
#3 200610-100 rs36757 MT 15172 GG
#4 200610-102 rs1444029 MT 125 AA
#5 200610-105 rs3796687 MT 236 AT
#[[7]]
# Name RsID Chr Position Sample7
#1 200610-1 rs423874 MT 2755 AA
#2 200610-10 rs94753345 MT 0 AA
#3 200610-100 rs36757 MT 15172 GG
#4 200610-102 rs1444029 MT 125 AA
#5 200610-105 rs3796687 MT 236 AA
或使用lapply
,遍历列名 5 到 11,使用该列和数据集cbind
的前 4 列对数据集进行子集化
lapply(names(df)[5:11], function(x) cbind(df[1:4], df[x]))
推荐阅读
- java - application.properties 中的 spring.cache.type=redis 在启动时抛出异常
- c# - ASP.NET MVC - 用逗号分隔数字
- cucumber - 如何从输出结果中忽略部分字符
- android - 在 Android NDK 中构建图形 UI
- networking - 通过网络同时进行千兆位写入
- macos - 如何使用 AppleScript 关闭 Safari 偏好设置窗口?
- excel - 如何使用 IF 以及 AND 和多个 OR 条件创建 Excel 公式
- ajax - 每秒使用 Ajax 请求有多安全
- python - python的subprocess.Popen()实时刷新颜色输出
- makefile - Make:递归后删除目标