我相信,我需要一个简单的任务帮助。我不习惯在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个任务。例如,为MLB
和D
执行的任务1)到5)之间的唯一区别只是字符串&#34; MLB&#34;和&#34; D&#34;。我尝试用这个MLB,D和其他11个字符串创建一个向量,然后使用assign
和paste
函数,但没有成功。
所以,简而言之,我想要的是使用以下方法:
A)功能/循环;
B)lapply;
C)如果可能,只需更改字符串MLB
和D
即可执行任务。
当然,一个解决方案对我来说已经足够了。其他人只是在教学上更好地理解R。
非常感谢您提前。如果您需要更多信息,请告诉我。
答案 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