R:如何在数据框中使用“创建新列”;countif“;来自另一个数据帧的值?
我有一个数据帧(df1),如下所示。它表示公司活跃于特定市场的年份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
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将变量视为因子而不是数字。我现在纠正了这个问题,它似乎起了作用。再次感谢!