"for"循环应用于两个表(数据帧)以将另一列中的值相加



我有一个有关R编程的问题。如果我有两个桌子,例如:

Table_1
Name        Flag
AA          0
BB          1
CC          0
DD          1
EE          1
FF          1
GG          0
HH          1

Table_2
Name    Value   Flag
AA      20      0
BB      30      1
BB      50      1
CC      40      0
EE      30      1
EE      80      1
GG      20      0
HH      70      1
DD      50      1
FF      10      1

我需要像Table_3这样的输出,它是Table_1Table_2的组合,例如每当Table_2中有Flag 1(两个表中的公共字段)时,value应添加到Table_1中。表Table_1Table_2中的NameFlag对于EX来说将保持不变。如果AATable_1中具有flag 0,则在Table_2中会相同。在结果表中,Table_3行必须与表_1相同,并且必须将值添加到Table_2Name中。

问题:我该怎么做?是否可以申请循环(表有大量的行)或简单地操纵表。

Table_3
Name        Flag   Value
AA          0       0
BB          1       80
CC          0       0
DD          1       50
EE          1       110
FF          1       10
GG          0       0
HH          1       70

添加了您的数据以供以后使用:

Table1 <- data.frame(Name = paste(LETTERS[seq(1,8,1)],LETTERS[seq(1,8,1)],sep = ""), 
    Flag = c(0,1,0,1,1,1,0,1))
Table2 <- data.frame(Name = c("AA","BB","BB","CC","EE","EE","GG","HH","DD","FF"), 
                     Value = c(20,30,50,40,30,80,20,70,50,10),
                     Flag = c(0,1,1,0,1,1,0,1,1,1))

尝试使用软件包,例如,dplyr软件包确实很强大。以下是组合表的两种方法:(由于表2具有所有信息,因此并不需要表1)

library(dplyr)
Table3.1 <- Table2 %>%
  group_by(Name) %>%
  summarise(Value = sum(Value*Flag))
Table3.2 <- Table2 %>%
  group_by(Name) %>%
summarise(Value = sum(Value[Flag == 1])) 

结果:

  Name  Value
  <fct>  <dbl>
1 AA         0
2 BB        80
3 CC         0
4 DD        50
5 EE       110
6 FF        10
7 GG         0
8 HH        70

为什么您实际上需要Table_1?我们只能使用Table_2生成您的预期输出。

以下方面的技巧:

df <- structure(list(Name = c("AA", "BB", "BB", "CC", "EE", "EE", "GG", 
                              "HH", "DD", "FF"), Value = c(20, 30, 50, 40, 30, 80, 20, 70, 
                                                           50, 10), Flag = c(0, 1, 1, 0, 1, 1, 0, 1, 1, 1)), .Names = c("Name", 
                                                                                                                        "Value", "Flag"), row.names = c(NA, -10L), spec = structure(list(
                                                                                                                          cols = structure(list(Name = structure(list(), class = c("collector_character", 
                                                                                                                                                                                   "collector")), `   Value` = structure(list(), class = c("collector_character", 
                                                                                                                                                                                                                                           "collector")), `  Flag` = structure(list(), class = c("collector_character", 
                                                                                                                                                                                                                                                                                                 "collector"))), .Names = c("Name", "   Value", "  Flag")), 
                                                                                                                          default = structure(list(), class = c("collector_guess", 
                                                                                                                                                                "collector"))), .Names = c("cols", "default"), class = "col_spec"), class = c("tbl_df", 
                                                                                                                                                                                                                                              "tbl", "data.frame"))
library(dplyr)
df %<>% group_by(Name) %>% summarise(Value = sum(Value * Flag))

输出是:

  Name Value Flag
1   AA     0    0
2   BB    80    1
3   CC     0    0
4   DD    50    1
5   EE   110    1
6   FF    10    1
7   GG     0    0
8   HH    70    1

最新更新