Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建一个循环或函数,用于收集使用r中另一个数据帧中的数据帧中的其他列值计算的多个向量的值?_R_Function_Loops_Dataframe - Fatal编程技术网

创建一个循环或函数,用于收集使用r中另一个数据帧中的数据帧中的其他列值计算的多个向量的值?

创建一个循环或函数,用于收集使用r中另一个数据帧中的数据帧中的其他列值计算的多个向量的值?,r,function,loops,dataframe,R,Function,Loops,Dataframe,我有一个巨大的数据框,下面给出了它的快照,给出了国家、变量名(Conva、EMP)、first3中的年份以及接下来3列中变量AGR、MFR和SER的值。我想根据var name列中的变量和每个国家每年AGR:SER cols中的值计算ConVA/EMP的日志。下面给出了数据帧df的示例 df 国家变量年份AGR制造商SER CHN ConVA 1952 346 921 108 CHN ConVA 1953 342 143 432 中国环境管理局1952 171 432 313 中国环境管理计划1

我有一个巨大的数据框,下面给出了它的快照,给出了国家、变量名(Conva、EMP)、first3中的年份以及接下来3列中变量AGR、MFR和SER的值。我想根据var name列中的变量和每个国家每年AGR:SER cols中的值计算ConVA/EMP的日志。下面给出了数据帧df的示例

df

国家变量年份AGR制造商SER

CHN ConVA 1952 346 921 108

CHN ConVA 1953 342 143 432

中国环境管理局1952 171 432 313

中国环境管理计划1953 199 300 432

香港康华2001 905 118 106

香港政府环境管理计划2001 604 254 320

我通过以下AGR代码来实现这一点:
dfagrloglabpr%传播(变量,AGR)%%>%突变(AGRLabProd=ConVA/EMP)%%>%突变(LogAGRLabProd=log(AGRLabProd))%%>%选择(国家,年份,LogAGRLabProd))
,根据需要为我提供AGR的日志值。但是,如果我想通过创建一个循环或函数,在一个数据帧中按国家和年份获得所有扇区(AGR、MFR、SER)的日志值,我会遇到问题。我尝试过按扇区使用循环,但每次都会出错。对于将按扇区运行并在数据帧中收集值的代码,有什么解决方案或提示吗?否则,我只能考虑为每个扇区单独运行代码,然后合并,但随着扇区数量的增加,这会变得很麻烦

如果我们需要申请多列,在按“国家”、“年份”分组后,使用
mutate_at
(假设“ConVA”、“EMP”各有一行),将
mutate_at
中选择的列子集,除以字符串为“EMP”的相应值,并取
log

library(dplyr)   
df1 %>%
     group_by(Country, Year) %>% 
     mutate_at(vars(AGR:SER),  list(LogLabProd = ~ 
                   log(.[Var == 'ConVA']/.[Var == 'EMP'])))
# A tibble: 6 x 9
# Groups:   Country, Year [3]
#  Country Var    Year   AGR   MFR   SER AGR_LogLabProd MFR_LogLabProd SER_LogLabProd
#  <chr>   <chr> <int> <int> <int> <int>          <dbl>          <dbl>          <dbl>
#1 CHN     ConVA  1952   346   921   108          0.705          0.757          -1.06
#2 CHN     ConVA  1953   342   143   432          0.542         -0.741           0   
#3 CHN     EMP    1952   171   432   313          0.705          0.757          -1.06
#4 CHN     EMP    1953   199   300   432          0.542         -0.741           0   
#5 HKG     ConVA  2001   905   118   106          0.404         -0.767          -1.10
#6 HKG     EMP    2001   604   254   320          0.404         -0.767          -1.10

如果我们不需要创建新列,而只需要
summary
d输出,那么使用
summary\u at
而不是
mutate\u at

df1 %>%
     group_by(Country, Year) %>% 
     summarise_at(vars(AGR:SER),  list(LogLabProd = ~ 
                   log(.[Var == 'ConVA']/.[Var == 'EMP'])))
# A tibble: 3 x 5
# Groups:   Country [2]
#  Country  Year AGR_LogLabProd MFR_LogLabProd SER_LogLabProd
#  <chr>   <int>          <dbl>          <dbl>          <dbl>
#1 CHN      1952          0.705          0.757          -1.06
#2 CHN      1953          0.542         -0.741           0   
#3 HKG      2001          0.404         -0.767          -1.10
df1%>%
集团单位(国家,年份)%>%
总结(vars(AGR:SER)、列表(LogLabProd=~
日志([Var=='ConVA']/[Var=='EMP']]))
#一个tibble:3x5
#分组:国家[2]
#国家年份AGR_LogLabProd制造商LogLabProd服务LogLabProd
#                                   
#1 CHN 1952 0.705 0.757-1.06
#2 CHN 1953 0.542-0.7410
#3 HKG 2001 0.404-0.767-1.10
通过这样做,我们实际上跳过了重塑部分

数据
df1如果我们需要申请多个列,在按“国家”、“年份”分组后,使用
mutate_at
(假设“ConVA”、“EMP”各有一行),将
mutate_at
中选择的列子集,并除以字符串为“EMP”的相应值,取
log

library(dplyr)   
df1 %>%
     group_by(Country, Year) %>% 
     mutate_at(vars(AGR:SER),  list(LogLabProd = ~ 
                   log(.[Var == 'ConVA']/.[Var == 'EMP'])))
# A tibble: 6 x 9
# Groups:   Country, Year [3]
#  Country Var    Year   AGR   MFR   SER AGR_LogLabProd MFR_LogLabProd SER_LogLabProd
#  <chr>   <chr> <int> <int> <int> <int>          <dbl>          <dbl>          <dbl>
#1 CHN     ConVA  1952   346   921   108          0.705          0.757          -1.06
#2 CHN     ConVA  1953   342   143   432          0.542         -0.741           0   
#3 CHN     EMP    1952   171   432   313          0.705          0.757          -1.06
#4 CHN     EMP    1953   199   300   432          0.542         -0.741           0   
#5 HKG     ConVA  2001   905   118   106          0.404         -0.767          -1.10
#6 HKG     EMP    2001   604   254   320          0.404         -0.767          -1.10

如果我们不需要创建新列,而只需要
summary
d输出,那么使用
summary\u at
而不是
mutate\u at

df1 %>%
     group_by(Country, Year) %>% 
     summarise_at(vars(AGR:SER),  list(LogLabProd = ~ 
                   log(.[Var == 'ConVA']/.[Var == 'EMP'])))
# A tibble: 3 x 5
# Groups:   Country [2]
#  Country  Year AGR_LogLabProd MFR_LogLabProd SER_LogLabProd
#  <chr>   <int>          <dbl>          <dbl>          <dbl>
#1 CHN      1952          0.705          0.757          -1.06
#2 CHN      1953          0.542         -0.741           0   
#3 HKG      2001          0.404         -0.767          -1.10
df1%>%
集团单位(国家,年份)%>%
总结(vars(AGR:SER)、列表(LogLabProd=~
日志([Var=='ConVA']/[Var=='EMP']]))
#一个tibble:3x5
#分组:国家[2]
#国家年份AGR_LogLabProd制造商LogLabProd服务LogLabProd
#                                   
#1 CHN 1952 0.705 0.757-1.06
#2 CHN 1953 0.542-0.7410
#3 HKG 2001 0.404-0.767-1.10
通过这样做,我们实际上跳过了重塑部分

数据
df1刚刚添加了一个表刚刚添加了一个表它给了我以下错误:UseMethod中的错误(“group_by_uu”):没有适用于“group_by_u”的方法应用于“character”类的对象@user12081247.您是否使用了我帖子中相同的
数据
。另外,
dplyr
的包版本是什么。我使用了
packageVersion('dplyr')[1]'0.8.3'
是的,它是相同的dplyr版本。原始数据帧是这样的:str(df)类“tbl_df”、“tbl”和“data.frame”:1629 obs.共14个变量:$Country:chr“CHN”“CHN”“CHN”“CHN”…-attr(,“label”)=chr“Country”.-attr(,“format.stata”)=chr“%9s”$Variable:chr“ConVA”“ConVA”“ConVA”…-attr(,“label”)=chr“Variable”.-attr(,“format.stata”)=chr“%9s”$Year:num 1952 1953 1954 1955 1956...-attr(*,“label”)=chr“Year”$AGR:num 3.46e+11 3.52e+11 3.58e+11 3.89e+11 4.08e+11...@user12081247.您尚未回答错误是来自测试此数据还是原始数据。如果它来自原始数据,请使用
dput
复制粘贴该输出(
dput(head(yourdata,10))
在您的帖子中了解结构我重新加载了dplyr包,现在group_by error不在那里。相反,错误是错误:列AGR_LogLabProd的长度必须为1(组大小),而不是0。这可能是因为数据集中某些国家的ConVA和EMP向量的年长度在某些情况下不同?它给了我以下错误:UseMethod中的错误(“group_by_”):没有适用于“character”类对象的“group_by_”的方法@user12081247.您是否使用了我帖子中相同的
数据
。另外,
dplyr
的包版本是什么。我使用了
packageVersion('dplyr')[1]'0.8.3'
是的,它是相同的dplyr版本。原始数据帧是这样的:str(df)类“tbl_df”、“tbl”和“data.frame”:1629 obs.共14个变量:$Country:chr“CHN”“CHN”“CHN”“CHN”…-attr(,“label”)=chr“Country”.-attr(,“format.stata”)=chr“%9s”$Variable:chr“ConVA”“ConVA”“ConVA”…-attr(,“label”)=chr“Variable”.-attr(,“format.stata”)=chr“%9s”$Year:num 1952 1953 1954 1955 1956。。