我对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
的组合,例如,
只要Flag
中有Table_2
1个(两个表中的公用字段),就应将value
添加到Table_1
中。
例如,两个表Name
和Flag
中的Table_1
和Table_2
将保持不变。如果AA
在flag 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
答案 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