数据透视表的功能和R中的合并

时间:2017-11-17 19:07:14

标签: r

我相信,我需要一个简单的任务帮助。我不习惯在R中运作。 我有两个数据框(df1和df2),我想:

1)按列值过滤df1(输出= A);

2)从A(输出= B)生成数据透视表;

3)重命名B列;

4)将此数据透视表B与第二个数据帧df2(输出= C);

合并

5)将列的值从df2除以C中列的值。

我想执行此任务13次,这就是为什么我想要function / loop /使用lapply或任何其他方式生活更轻松。

如我所见,在R中通常最好使用lapply。直觉上,我会使用某种函数或循环来完成这项任务。

检查以下两个变量(MLB和D)的可重现示例。

library(dplyr)
df<-   as.data.frame(cbind(c("NC_1","NC_1","NC_2","NC_2","NC_2","NC_1","NC_1","NC_1","NC_2","NC_1"),
              c("MLB","MLB","MLB","MLB","MLB","MLB","D","D","D","D"),
                 c("ATT","ATT","ATT","ATT1","ATT1","ATT1","ATT1","ATT1","ATT1","ATT1")))

names(df) <- c("TAG", "ST", "ATR")
general.table<-table(df$TAG)
general.table<-as.data.frame(general.table)
names(general.table) <- c("TAG", "OCC")

# MLB

MLB.df<-filter(df, grepl('MLB', ST)) # 1) Filter 
MLB.df.table<-as.data.frame(table(MLB.df$TAG)) # 2) Pivot Table
names(MLB.df.table)<-c("TAG", "Partial_Score") # 3) Rename 
MLB.df.final.table<-merge(general.table,MLB.df.table,by='TAG', all.x=T) # 4) Merge
MLB.df.final.table$Partial_Score<-MLB.df.final.table$Partial_Score / general.table$OCC # 5) Divide one column by other

# D - The same tasks to be performed just like MLB
D.df<-filter(df, grepl('D', ST))
D.df.table<-as.data.frame(table(D.df$TAG))
names(D.df.table)<-c("TAG", "Partial_Score")
D.df.final.table<-merge(general.table,D.df.table,by='TAG', all.x=T)
D.df.final.table$Partial_Score<-D.df.final.table$Partial_Score / general.table$OCC

我也想知道是否有办法只通过更改字符串来执行这5个任务。例如,为MLBD执行的任务1)到5)之间的唯一区别只是字符串&#34; MLB&#34;和&#34; D&#34;。我尝试用这个MLB,D和其他11个字符串创建一个向量,然后使用assignpaste函数,但没有成功。

所以,简而言之,我想要的是使用以下方法:

A)功能/循环;

B)lapply;

C)如果可能,只需更改字符串MLBD即可执行任务。

当然,一个解决方案对我来说已经足够了。其他人只是在教学上更好地理解R。

非常感谢您提前。如果您需要更多信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

如果您不需要中间解决方案,只需要... final.table,我会建议以下功能:

calc.partial.score <- function(df, general.table, filter.expr) {
  df %>% 
    filter(grepl(filter.expr, ST)) %>%
    count(TAG) %>%
    merge(general.table, by = 'TAG', all.x = T) %>%
    mutate(Partial_Score = n / OCC) %>%
    select(-n)
}

以下列方式使用它:

> calc.partial.score(df, general.table, "MLB")
   TAG OCC Partial_Score
1 NC_1   6          0.50
2 NC_2   4          0.75

> calc.partial.score(df, general.table, "D")
   TAG OCC Partial_Score
1 NC_1   6          0.50
2 NC_2   4          0.25