我有2个数据集:
数据1:
Var1 Var2 Var3 Var4
10 10 2 3
9 2 8 3
6 4 4 8
7 3 10 8
Run Code Online (Sandbox Code Playgroud)
数据2:
Var1 Var5 Var3 Var6
3 6 6 4
1 2 5 1
9 2 2 9
2 6 3 2
Run Code Online (Sandbox Code Playgroud)
现在我想附加这2个数据集
最终数据:
Var1 Var2 Var3 Var4 Var5 Var6
10 10 2 3
9 2 8 3
6 4 4 8
7 3 10 8
3 4 6 6
1 1 2 5
9 9 2 2
2 …Run Code Online (Sandbox Code Playgroud) 我有五个data.frames,其中包含不同样本集的基因表达数据.我在每个data.set中有不同的行数,因此只有部分重叠的row.names(基因).
现在我希望a)过滤五个data.frames以仅包含所有data.frames中存在的基因和b)将这些基因的基因表达数据组合到一个data.frame.
我到目前为止所能找到的只是合并,但这只能合并两个data.frames,所以我必须多次使用它.有没有更简单的方法?
我即将合并大型数据集.这就是为什么我尝试使用data.table并且对它的速度感到激动.
# base R
system.time(
M1 <- Reduce(function(...) merge(..., all=TRUE), L)
)
# user system elapsed
# 5.05 0.00 5.20
# data.table
library(data.table)
L.dt <- lapply(L, function(x) setkeyv(data.table(x), c("sid", "id")))
system.time(
M2 <- Reduce(function(...) merge(..., all=TRUE), L.dt)
)
# user system elapsed
# 0.12 0.00 0.12
Run Code Online (Sandbox Code Playgroud)
两种方法都产生相同的值,但是有些列使用data.table进行拆分.
基地R:
set.seed(1)
car::some(M1, 5)
# sid id V3 V4 a b
# 60504 1 60504 -0.6964804 -1.210195 NA NA
# 79653 1 79653 -2.5287163 -1.087546 NA NA
# 111637 2 11637 0.7104236 NA …Run Code Online (Sandbox Code Playgroud) 请考虑以下列表.
lst <- list()
lst[[1]] <- data.frame(category = c(1:10), freq = rnorm(10))
lst[[2]] <- data.frame(category = seq(4,26,2), freq = rnorm(12))
lst[[3]] <- data.frame(category = 2:8, freq = rnorm(7))
Run Code Online (Sandbox Code Playgroud)
如果它们具有不同的维度和级别,我如何合并此类别中的数据框,因为它们具有不同的维度和级别,从而生成如下所示的data.frame?
category freq.1 freq.2 freq.3
1 1.2496154 NA NA
2 -1.3537722 NA -1.3257535
3 -0.3976305 NA 0.5761957
4 0.7721428 -0.2360636 -1.0953490
5 0.7653834 NA 0.9037617
6 0.2192559 -0.2543082 -1.6640824
7 0.3400192 NA -1.2961707
8 -0.8457081 -0.7431021 0.9321560
9 -1.2132615 NA NA
10 1.8387899 0.8342264 NA
12 NA -0.5409164 NA
14 NA 0.1638546 …Run Code Online (Sandbox Code Playgroud) df1 <- data.frame(name = c("A","B","C"), f1 = c(1,2,3), f2 = c("zz","mo","do"))
df2 <- data.frame(name = c("D","B","C"), f1 = c(1,4,6), f2 = c("ok","no","do"))
df3 <- data.frame(name = c("D","E","C"), f1 = c(1,2,3), f2 = c("so","yo","kl"))
Run Code Online (Sandbox Code Playgroud)
我想将它们合并到一个数据框中,以便它看起来像
name df.1f1 df1.f2 df2.f1 df2.f2 df3.f1 df3.f2
A 1 zz na na na na
B 2 mo 4 no na na
C 3 do 6 do 3 kl
D na na 1 ok 1 so
E na na na na 2 yo
Run Code Online (Sandbox Code Playgroud)
虽然我可以使用重复的dplyr :: full_join来做到这一点,但它太繁琐了.谁有更好的方法来做到这一点?
这个是一个doozy.我一直试图弄清楚这一点,但我一直在撞墙.所以,我是以科学的名义来寻找这个.
简介
我在目录中有大约93个具有唯一名称的文件.我使用r将这些文件读入列表.
files.measurements <- as.character(list.files(path = "~/measurements/", full.names = TRUE))
所以,这样做只是找到目录中所有文件的名称.所有这些文件都是.csv.给我带来了很多麻烦.
然后我读了文件的名称.
measurements.filenames <- gsub(".csv", "", basename(files.measurements))
读取这些文件的原因是因为每个文件名都代表测量的名称.文件中的相同项目可能存在也可能不存在于多个文件中.
例
有5个文件名,即,NameA,NameB,NameC,NameD,NameE.每个文件有8个列名:id,name,sex,dob,...,measurement.(每个文件名的名称相同)
当然,id是唯一的,但NameB如果存在,则可能存在也可能不存在int NameA.
需要
所以,我需要做的就是这些93个文件合并到一个单一的数据帧,使得数据帧中包含id,name,sex,dob和,......而不是measurement文件名- NameA,例如.对于相同的id,值应该相同,如果id不存在,则rbind对于具有附加列的数据帧,否则如果id存在,则只需measurement使用新列名称添加到列中NameB.
你能帮忙吗?这是为了研究收集心血管和HIV疾病的数据.
编辑
数据
NameA
id gender dob status date measurement
1 F 5/24/1942 Rpt 1/12/2018 2.9
2 F 12/1/2017 Rpt 1/12/2018 0.622 …Run Code Online (Sandbox Code Playgroud) 这是我的数据框列表:
[[1]]
ID Value
A 1
B 1
C 1
[[2]]
ID Value
A 1
D 1
E 1
[[3]]
ID Value
B 1
C 1
Run Code Online (Sandbox Code Playgroud)
我在左侧列中具有唯一(非冗余)ID的单个数据帧之后,在列中复制,并将NULL值设置为0:
ID [1]Value [2]Value [3]Value
A 1 1 0
B 1 0 1
C 1 0 1
D 0 1 0
E 0 1 0
Run Code Online (Sandbox Code Playgroud)
我试过了:
Reduce(function(x, y) merge(x, y, by=ID), datahere)
这提供了单个列表,但不考虑原始值的来源,并且在新行中重复重复的ID.
rbindlist(datahere, use.names=TRUE, fill=TRUE, idcol="Replicate")
Run Code Online (Sandbox Code Playgroud)
这提供了一个单独的列表,其中[x]值编号作为一个名为Replicate的新列,但它仍然不在我想要的结构中,因为ID列有冗余.