将“ for”循环应用于两个表(数据框)以将值添加到另一列中

时间:2019-02-13 16:08:21

标签: r

我对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的组合,例如, 只要Flag中有Table_2 1个(两个表中的公用字段),就应将value添加到Table_1中。 例如,两个表NameFlag中的Table_1Table_2将保持不变。如果AAflag 0中有Table_1,则在Table_2中将是相同的。 在结果表Table_3中,行必须与Table_1相同,并且值必须从Name分别添加到Table_2中。

问题:我该怎么做?是否可以应用For循环(表具有大量行)或仅对表进行操作。

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

2 个答案:

答案 0 :(得分:0)

您为什么真正需要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

答案 1 :(得分:0)

添加了数据供以后使用:

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