R:如何在数据框中使用“创建新列”;countif“;来自另一个数据帧的值?

R:如何在数据框中使用“创建新列”;countif“;来自另一个数据帧的值?,r,R,我有一个数据帧(df1),如下所示。它表示公司活跃于特定市场的年份 Company Country Year A Austria 2010 A Germany 2010 A Austria 2011 B Italy 2010 我现在有了第二个数据帧(df2),如下所示。它以虚拟变量的形式按投资类型列出了一家公司在给定时间在一个国家的所有投资 Company Country Year JointVenture M&a

我有一个数据帧(df1),如下所示。它表示公司活跃于特定市场的年份

Company  Country  Year
A        Austria  2010
A        Germany  2010
A        Austria  2011
B        Italy    2010
我现在有了第二个数据帧(df2),如下所示。它以虚拟变量的形式按投资类型列出了一家公司在给定时间在一个国家的所有投资

Company  Country  Year  JointVenture  M&A  Greenfield
A        Austria  2010  1             0    0
A        Austria  2010  0             1    0
A        Austria  2010  1             0    0
...
我现在的问题如下:我想在df1中添加一个新列,包括df2中所示的每种投资类型的“countif”。例如,新的df1:

Company  Country  Year  Count.JointVenture  Count.M&A  Count.Greenfield
A        Austria  2010  2                   1          0
A        Germany  2010  ...........
A        Austria  2011
B        Italy    2010
另外,我怎样才能向df1添加新的列,将这些计数转换为伪变量(如果大于0,则为1;如果为0,则为0)

对于这个基本的问题,我表示感谢和抱歉,但我没有在现有的线程中找到合适的解决方案

干杯, Martin使用aggregate()和ifelse()函数

# test data
df <- data.frame(Company = rep("A", 3), 
                 Country = rep("Austria", 3), 
                 Year = rep(2010, 3), 
                 JointVenture = c(1,0,1), 
                 MnA = c(0,1,0), 
                 Greenfield = rep(0,3))
# this is the new df
counts <- aggregate(cbind(JointVenture, MnA, Greenfield)~Country+Company+Year, data = df, FUN = sum)

# dummy
counts$dummyJointVenture <- ifelse(counts$JointVenture > 0, 1, 0)
counts$dummyMnA <- ifelse(counts$MnA > 0, 1, 0)
counts$dummyGreenfield <- ifelse(counts$Greenfield > 0, 1, 0)
测试数据 df使用aggregate()和ifelse()函数

# test data
df <- data.frame(Company = rep("A", 3), 
                 Country = rep("Austria", 3), 
                 Year = rep(2010, 3), 
                 JointVenture = c(1,0,1), 
                 MnA = c(0,1,0), 
                 Greenfield = rep(0,3))
# this is the new df
counts <- aggregate(cbind(JointVenture, MnA, Greenfield)~Country+Company+Year, data = df, FUN = sum)

# dummy
counts$dummyJointVenture <- ifelse(counts$JointVenture > 0, 1, 0)
counts$dummyMnA <- ifelse(counts$MnA > 0, 1, 0)
counts$dummyGreenfield <- ifelse(counts$Greenfield > 0, 1, 0)
测试数据
df我把我的
数据扔进了竞技场

df <- fread("Company  Country  Year
             A        Austria  2010
             A        Germany  2010
             A        Austria  2011
             B        Italy    2010")

df2 <- fread("Company  Country  Year  JointVenture  M&A  Greenfield
              A        Austria  2010  1             0    0
              A        Austria  2010  0             1    0
              A        Austria  2010  1             0    0")

setkey(df2, Company, Country, Year)
df2[,c("JointVenture", "M&A", "Greenfield") := .(sum(JointVenture), sum(`M&A`), sum(Greenfield)), by=.(Company, Country, Year)]
merge(x=df, y=unique(df2), by=c("Company", "Country", "Year"), all.x=T, all.y=F, suffixes = c("", "Count."))

我将我的
数据。表
尝试进入竞技场:

df <- fread("Company  Country  Year
             A        Austria  2010
             A        Germany  2010
             A        Austria  2011
             B        Italy    2010")

df2 <- fread("Company  Country  Year  JointVenture  M&A  Greenfield
              A        Austria  2010  1             0    0
              A        Austria  2010  0             1    0
              A        Austria  2010  1             0    0")

setkey(df2, Company, Country, Year)
df2[,c("JointVenture", "M&A", "Greenfield") := .(sum(JointVenture), sum(`M&A`), sum(Greenfield)), by=.(Company, Country, Year)]
merge(x=df, y=unique(df2), by=c("Company", "Country", "Year"), all.x=T, all.y=F, suffixes = c("", "Count."))

使用
dplyr::总结每个
合并
马丁的数据

df <- fread("Company  Country  Year
             A        Austria  2010
             A        Germany  2010
             A        Austria  2011
             B        Italy    2010")

df2 <- fread("Company  Country  Year  JointVenture  MA  Greenfield
              A        Austria  2010  1             0    0
              A        Austria  2010  0             1    0
              A        Austria  2010  1             0    0")
library(dplyr)
df2 %>% 
  group_by(Company, Country, Year) %>%
summarise_each(funs(sum), JointVenture:Greenfield) %>%
full_join(df, by = c("Company", "Country", "Year")) -> df
df%
每个项目的总结(funs(sum),合资企业:绿地)%>%
完全联接(df,by=c(“公司”、“国家”、“年份”)->df

编辑:用@zacdav输入的
摘要
替换为
摘要
,并用
完全加入
替换
合并
,以停留在
dplyr
中,使用
dplyr::摘要
合并
与马丁的数据

df <- fread("Company  Country  Year
             A        Austria  2010
             A        Germany  2010
             A        Austria  2011
             B        Italy    2010")

df2 <- fread("Company  Country  Year  JointVenture  MA  Greenfield
              A        Austria  2010  1             0    0
              A        Austria  2010  0             1    0
              A        Austria  2010  1             0    0")
library(dplyr)
df2 %>% 
  group_by(Company, Country, Year) %>%
summarise_each(funs(sum), JointVenture:Greenfield) %>%
full_join(df, by = c("Company", "Country", "Year")) -> df
df%
每个项目的总结(funs(sum),合资企业:绿地)%>%
完全联接(df,by=c(“公司”、“国家”、“年份”)->df

编辑:用@zacdav的输入将
摘要
替换为
每个摘要
,并将
合并
替换为
完全加入
以留在
dplyr

每个摘要(funs(sum),JointVenture:Greenfield)
@zacdav谢谢!我添加了这个解决方案,因为它可以更好地扩展
总结每个(funs(sum),JointVenture:Greenfield)
@zacdav谢谢!我添加了这个解决方案,因为它可以更好地扩展,对于虚拟部分的更大数据,这将变得很乏味。@zacdav是的,这是一个很好的观点。我没有考虑数据的大小。您对choubi的输入对于更大的数据集来说是一个更好的实现。@carlo-谢谢,我尝试了aggregate()参数:aggregatedbyguo@Martin,用于guo、country.iso和year的特定组合,您是否可以执行以下操作来检查是否确实只有一个采集案例,让df作为您的数据帧。:
caseOfInterest@carlo感谢您的帮助!我对原始代码做了一些工作,问题似乎是R将变量视为因子而不是数字。我现在纠正了这个问题,它似乎起了作用。再次感谢!另外,对于虚拟部分,这将变得更大的数据变得乏味。@zacdav是的,这是一个好的观点。我没有考虑数据的大小。您对choubi的输入对于更大的数据集来说是一个更好的实现。@carlo-谢谢,我尝试了aggregate()参数:aggregatedbyguo@Martin,用于guo、country.iso和year的特定组合,您是否可以执行以下操作来检查是否确实只有一个采集案例,让df作为您的数据帧。:
caseOfInterest@carlo感谢您的帮助!我对原始代码做了一些工作,问题似乎是R将变量视为因子而不是数字。我现在纠正了这个问题,它似乎起了作用。再次感谢!