我有一个有关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_1
和Table_2
的组合,例如每当Table_2
中有Flag
1(两个表中的公共字段)时,value
应添加到Table_1
中。表Table_1
和Table_2
中的Name
和Flag
对于EX来说将保持不变。如果AA
在Table_1
中具有flag 0
,则在Table_2
中会相同。在结果表中,Table_3
行必须与表_1相同,并且必须将值添加到Table_2
的Name
中。
问题:我该怎么做?是否可以申请循环(表有大量的行)或简单地操纵表。
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