R 根据匹配的列名将两个数据帧添加到一起
我有两个数据集,我想根据匹配的列名将它们添加到一起。对于数据集,每行代表一个研究场地,每列代表一个调查。每次调查仅限于一个街区。我想根据列名将每个数据集的内容添加到一起 数据集1(1表示进行了调查): 数据集2是数据集1的子集,其中1表示在调查期间发现了感兴趣的物种 数据集2:R 根据匹配的列名将两个数据帧添加到一起,r,R,我有两个数据集,我想根据匹配的列名将它们添加到一起。对于数据集,每行代表一个研究场地,每列代表一个调查。每次调查仅限于一个街区。我想根据列名将每个数据集的内容添加到一起 数据集1(1表示进行了调查): 数据集2是数据集1的子集,其中1表示在调查期间发现了感兴趣的物种 数据集2: Block A1 A2 A4 A5 1 0 1 0 0 3 0 0 0 1 理想的输出应该是这样的,其中2表示进行了调查并发现了感兴趣的物种,1表示进行了调查,0
Block A1 A2 A4 A5
1 0 1 0 0
3 0 0 0 1
理想的输出应该是这样的,其中2表示进行了调查并发现了感兴趣的物种,1表示进行了调查,0表示未进行调查
数据集3:
Block A1 A2 A3 A4 A5
1 0 2 0 0 0
2 1 0 0 1 0
3 0 0 1 0 2
因此,我会比这里的其他人更低效地处理这个问题:
library(tidyverse)
data1 %>%
gather(key,value,-Block) %>%
rbind(data2 %>%
gather(key,value, -Block)) %>%
group_by(Block, key) %>%
summarise(All_vals = sum(value)) %>%
spread(key, All_vals)
结果如下:
Block A1 A2 A3 A4 A5
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 0 2 0 0 0
2 2 1 0 0 1 0
3 3 0 0 1 1 2
块A1 A2 A3 A4 A5
1 1 0 2 0 0 0
2 2 1 0 0 1 0
3 3 0 0 1 1 2
所以我会比这里的其他人更低效地处理这个问题:
library(tidyverse)
data1 %>%
gather(key,value,-Block) %>%
rbind(data2 %>%
gather(key,value, -Block)) %>%
group_by(Block, key) %>%
summarise(All_vals = sum(value)) %>%
spread(key, All_vals)
结果如下:
Block A1 A2 A3 A4 A5
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 0 2 0 0 0
2 2 1 0 0 1 0
3 3 0 0 1 1 2
块A1 A2 A3 A4 A5
1 1 0 2 0 0 0
2 2 1 0 0 1 0
3 3 0 0 1 1 2
使用基本R
matrix2 <- matrix(rep(0, length.out = nrow(dataset1)*ncol(dataset1)),
ncol = ncol(dataset1))
#then make sure the column names match dataset1 (not dataset2)
names(matrix2) <- names(dataset1)
for (i in 1:ncol(matrix2)) {
if (any(names(dataset2) == names(matrix2)[i]
matrix2[,i] <- dataset2[,which(names(dataset2) == names(matrix2)[i]]
}
}
matrix2使用基数R
matrix2 <- matrix(rep(0, length.out = nrow(dataset1)*ncol(dataset1)),
ncol = ncol(dataset1))
#then make sure the column names match dataset1 (not dataset2)
names(matrix2) <- names(dataset1)
for (i in 1:ncol(matrix2)) {
if (any(names(dataset2) == names(matrix2)[i]
matrix2[,i] <- dataset2[,which(names(dataset2) == names(matrix2)[i]]
}
}
matrix2编辑
使用dplyr动词和%%>%
,您似乎有点不舒服,因此我决定添加一些其他可能的解决方案,您可能会发现它们更吸引人
请注意,如果您的一个或多个变量是非数字的,那么这些解决方案都不起作用,而实际数据似乎就是这样。您需要找出哪些是非数字的,然后将它们转换为数字或删除它们
使用基数R
rbind
函数将通过匹配变量连接数据帧(如果它们都具有相同的变量)。您应该使用值NA
将缺少的变量添加到数据帧中,然后将它们添加到rbind
中。然后,您可以对组合数据帧的子集调用aggregate
,并按块的级别求和:
full_df%
分组依据(块)%>%
汇总所有数据(总和,不适用rm=T)
####输出####
#一个tibble:3x6
A1座A2座A3座A4座A5座
1 1 0 2 0 0 0
2 2 1 0 0 1 0
3 3 0 0 1 0 2
使用data.table
另一种选择是使用data.table,它以速度快著称,并且使用一些人喜欢的不同语法
库(data.table)
完全编辑
使用dplyr动词和%%>%
,您似乎有点不舒服,因此我决定添加一些其他可能的解决方案,您可能会发现它们更吸引人
请注意,如果您的一个或多个变量是非数字的,那么这些解决方案都不起作用,而实际数据似乎就是这样。您需要找出哪些是非数字的,然后将它们转换为数字或删除它们
使用基数R
rbind
函数将通过匹配变量连接数据帧(如果它们都具有相同的变量)。您应该使用值NA
将缺少的变量添加到数据帧中,然后将它们添加到rbind
中。然后,您可以对组合数据帧的子集调用aggregate
,并按块的级别求和:
full_df%
分组依据(块)%>%
汇总所有数据(总和,不适用rm=T)
####输出####
#一个tibble:3x6
A1座A2座A3座A4座A5座
1 1 0 2 0 0 0
2 2 1 0 0 1 0
3 3 0 0 1 0 2
使用data.table
另一种选择是使用data.table,它以速度快著称,并且使用一些人喜欢的不同语法
库(data.table)
你的数据有多大?对于数据集1,我有超过220个站点(行)的3500个调查(列),数据集2有超过56个站点的130个调查。你想根据列和行进行添加,对吗?输出中是否有输入错误?数据集2的行标签3在第4列中有一个1,但它看起来像是从数据集2添加到第3列中的…@gershtbind_rows
不要求两个数据帧具有相同的列,因此没有区别。事实上,你对这个问题的回答与关于该重复项的公认答案是相同的(除了使用na.rm=T
参数)@gersht这很好,人们对重复项有不同的看法——这就是为什么我们有温和和封闭投票制度的原因。尽管如此,我认为答案中的代码与副本中的代码相同这一事实是一个很好的线索,这实际上是一个副本。您的数据有多大?对于数据集1,我有超过220个站点(行)的约3500个调查(列),而数据集2有超过56个站点的约130个调查。您希望添加基于列和行,对吗?输出中是否有输入错误?数据集2的行标签3在第4列中有一个1,但它看起来像是从数据集2添加到第3列中的…@gershtbind_rows
不要求两个数据帧具有相同的列,因此没有区别。事实上,你对这个问题的回答与关于该重复项的公认答案是相同的(除了使用na.rm=T
参数)@gersht这很好,人们对重复项有不同的看法——这就是为什么我们有温和和封闭投票制度的原因。尽管如此,我认为答案中的代码与副本中的代码完全相同,这是一个很好的线索,这实际上是一个副本。这很好,因为如果data2
在data1
中缺少一些元素,而不仅仅是其他方面,它也会工作得很好。我对R比较陌生,我不理解“%%>”符号。@DevinMendez它是管道操作器