如何解决有没有办法让函数返回数据帧? 数据
我正在尝试编写一个将返回数据帧的函数。基本上,目标是具有三列:一列列出某个标识符,一列报告该标识符在数据集A的一列中出现的频率,一列报告该标识符在数据集B的一列中出现的频率。功能,无法弄清楚为什么要打印而不是将其存储为数据框。这尤其令人迷惑,因为当我在函数外部运行“ if”循环时,它将创建所需的数据帧。任何帮助将不胜感激。
数据样本为:
UOF$identifier Citations$identifier
1545 1712
1588 646
1640 1545
1545 1645
1545 646
1588 1545
1640
1640
我希望此函数返回:
value instances in dataset 1 instances in dataset 2
1545 3 2
1588 2 0
1640 1 2
join_analysis<-function(column_name_fromdataset1,column_name_fromdataset2){
Dataset1<-as.numeric(column_name_fromdataset1)
Dataset2<-as.numeric(column_name_fromdataset2)
unique_values1<-unique(Dataset1)
count<-data.frame(matrix(NA,nrow=length(Dataset2),ncol=3))
for (i in 1:length(unique_values1)){
ID<-unique_values1[i]
count[,3][i]<-sum(Dataset2==ID,na.rm = TRUE)
count[,2][i]<-sum(Dataset1==ID,na.rm=TRUE)
count[,1][i]<-unique_values1[i]
}
colnames(count)<-cbind("value","instances in dataset 1","instances in dataset 2")
return(as.data.frame(count))
}
解决方法
我们可以使用table
和merge
以更简单的方式执行此操作,而无需循环或使用任何外部包。我们只需要第一个数据集的unique
值就可以使'identifier'列成为factor
,并从第一个数据集中分配了levels
,得到table
并进行{ {1}}(来自merge
)
base R
或者另一个选择是join_analysis <- function(dat1,dat2,colnm1) {
lvls <- unique(dat1[[colnm1]])
tbl1 <- table(factor(dat1[[colnm1]],levels = lvls))
tbl2 <- table(factor(dat2[[colnm1]],levels = lvls))
out <- merge(tbl1,tbl2,by = 'row.names')[-c(1,4)]
names(out) <- c('value','instances in dataset 1','instances in dataset 2')
return(out)
}
join_analysis(UOF,Citations,'identifier')
# value instances in dataset 1 instances in dataset 2
#1 1545 3 2
#2 1588 2 0
#3 1640 1 2
pivot_wider
或者另一种选择是在library(dplyr)
library(tidyr)
bind_rows(UOF,.id = 'grp') %>%
filter(identifier %in% unique(UOF$identifier)) %>%
count(grp,identifier) %>%
pivot_wider(names_from = grp,values_from = n,values_fill = 0)
的两个数据集中进行count
,然后用list
进行reduce
left_join
数据
library(purrr)
list(UOF,Citations) %>%
map(~ .x %>%
count(identifier)) %>%
reduce(left_join,by = 'identifier')
,
我建议使用这种UOF <- structure(list(identifier = c(1545,1588,1640,1545,1588
)),class = "data.frame",row.names = c(NA,-6L))
Citations <- structure(list(identifier = c(1712,646,1645,1640)),-8L))
方法和内置函数来避免循环。该函数将两个参数作为字符串使用,它们属于每个数据集中的列名称。之后,它将合并结果:
dplyr
输出:
library(dplyr)
#Function
myfun <- function(x,y)
{
#Dataset 1
r1 <- df1 %>% group_by(id=df1[,x]) %>% summarise(N1=n())
#Dataset 2
r2 <- df2 %>% group_by(id=df2[,y]) %>% summarise(N2=n())
#Join
r3 <- left_join(r1,r2)
#Fill
r3 %>% replace(is.na(.),0) -> r3
return(r3)
}
#Apply function
myfun(x = 'UOF',y = 'Identifier')
使用了一些数据:
# A tibble: 3 x 3
id N1 N2
<int> <int> <int>
1 1545 3 2
2 1588 2 0
3 1640 1 2
,
如果您想使用基数R,也许可以像下面那样尝试merge
+ stack
merge(aggregate(. ~ ind,stack(table(UOF)),sum),aggregate(. ~ ind,stack(table(Citations)),by = "ind",all.x = TRUE
)
给出
ind values.x values.y
1 1545 3 2
2 1588 2 NA
3 1640 1 2
数据
UOF <- data.frame(identifier = c(1545,1588))
Citations <- data.frame(identifier = c(1712,1640))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。