Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据匹配的列名将两个数据帧添加到一起_R - Fatal编程技术网

R 根据匹配的列名将两个数据帧添加到一起

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

我有两个数据集,我想根据匹配的列名将它们添加到一起。对于数据集,每行代表一个研究场地,每列代表一个调查。每次调查仅限于一个街区。我想根据列名将每个数据集的内容添加到一起

数据集1(1表示进行了调查):

数据集2是数据集1的子集,其中1表示在调查期间发现了感兴趣的物种

数据集2:

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列中的…@gersht
bind_rows
不要求两个数据帧具有相同的列,因此没有区别。事实上,你对这个问题的回答与关于该重复项的公认答案是相同的(除了使用
na.rm=T
参数)@gersht这很好,人们对重复项有不同的看法——这就是为什么我们有温和和封闭投票制度的原因。尽管如此,我认为答案中的代码与副本中的代码相同这一事实是一个很好的线索,这实际上是一个副本。您的数据有多大?对于数据集1,我有超过220个站点(行)的约3500个调查(列),而数据集2有超过56个站点的约130个调查。您希望添加基于列和行,对吗?输出中是否有输入错误?数据集2的行标签3在第4列中有一个1,但它看起来像是从数据集2添加到第3列中的…@gersht
bind_rows
不要求两个数据帧具有相同的列,因此没有区别。事实上,你对这个问题的回答与关于该重复项的公认答案是相同的(除了使用
na.rm=T
参数)@gersht这很好,人们对重复项有不同的看法——这就是为什么我们有温和和封闭投票制度的原因。尽管如此,我认为答案中的代码与副本中的代码完全相同,这是一个很好的线索,这实际上是一个副本。这很好,因为如果
data2
data1
中缺少一些元素,而不仅仅是其他方面,它也会工作得很好。我对R比较陌生,我不理解“%%>”符号。@DevinMendez它是管道操作器