我正在尝试编写一个将返回数据帧的函数。基本上,目标是具有三列:一列列出某个标识符,一列报告该标识符在数据集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))
}
答案 0 :(得分:2)
我们可以使用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, Citations, .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')
答案 1 :(得分:2)
我建议使用这种UOF <- structure(list(identifier = c(1545, 1588, 1640, 1545, 1545, 1588
)), class = "data.frame", row.names = c(NA, -6L))
Citations <- structure(list(identifier = c(1712, 646, 1545, 1645, 646, 1545,
1640, 1640)), class = "data.frame", row.names = c(NA, -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
答案 2 :(得分:2)
如果您想使用基数R,也许可以像下面那样尝试merge
+ stack
merge(aggregate(. ~ ind, stack(table(UOF)), sum),
aggregate(. ~ ind, stack(table(Citations)), sum),
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, 1640, 1545, 1545, 1588))
Citations <- data.frame(identifier = c(1712, 646, 1545, 1645, 646, 1545, 1640, 1640))