我需要特定格式的data.frame进行社交结构分析。如何转换包含多个事件中一起出现的个人列表的data.frame:
my.df <- data.frame(individual = c("A","B","C","B","C","D"),
time = rep(c("event_01","event_02"), each = 3))
individual time
1 A event_01
2 B event_01
3 C event_01
4 B event_02
5 C event_02
6 D event_02
进入包含每对出现的data.frame(包括[A,A]; [B,B]等对:
ind_1 ind_2 times
A A 0
A B 1
A C 1
A D 0
B A 1
B B 0
B C 2
B D 1
C A 1
C B 2
C C 0
C D 1
D A 0
D B 1
D C 1
D D 0
答案 0 :(得分:8)
在基础R中,您可以执行以下操作:
data.frame(as.table(`diag<-`(tcrossprod(table(my.df)), 0)))
# individual individual.1 Freq
# 1 A A 0
# 2 B A 1
# 3 C A 1
# 4 D A 0
# 5 A B 1
# 6 B B 0
# 7 C B 2
# 8 D B 1
# 9 A C 1
# 10 B C 2
# 11 C C 0
# 12 D C 1
# 13 A D 0
# 14 B D 1
# 15 C D 1
# 16 D D 0
tcrossprod
为您提供以下内容:
> tcrossprod(table(my.df))
individual
individual A B C D
A 1 1 1 0
B 1 2 2 1
C 1 2 2 1
D 0 1 1 1
这基本上是您要查找的所有信息,但您希望它的形式略有不同,没有对角线值。
我们可以使用以下方法将对角线设置为零
`diag<-`(theOutputFromAbove, 0)
然后,要获得长格式,请使用matrix
欺骗R认为生成的table
是as.table
,并使用data.frame
方法table
秒。
答案 1 :(得分:4)
你可以这样做:
创建新data.frame的前2个变量:
df2$times[df2[, 1]==df2[, 2]] <- 0
将相同个体对的值设为0:
comb_diff <- combn(levels(my.df$individual), 2)
查看其他独特组合:
times_uni <- apply(comb_diff, 2, function(inds){
sum(table(my.df$time[my.df$individual %in% inds])==2)
})
计算一起找到每个唯一组合的时间:
df2$times[match(c(paste0(comb_diff[1,], comb_diff[2,]), paste0(comb_diff[2, ], comb_diff[1, ])), paste0(df2[, 1],df2[, 2]))] <- rep(times_uni, 2)
df2
# ind_1 ind_2 times
#1 A A 0
#2 A B 1
#3 A C 1
#4 A D 0
#5 B A 1
#6 B B 0
#7 B C 2
#8 B D 1
#9 C A 1
#10 C B 2
#11 C C 0
#12 C D 1
#13 D A 0
#14 D B 1
#15 D C 1
#16 D D 0
最后,填写新的data.frame:
INSERT INTO [dbo].[TableOnlyPK]
DEFAULT VALUES
答案 2 :(得分:0)
您可以使用data.table
来完成Solution Properties > Build > Optimized Code