如何基于另一个对称数据框在R中创建对称数据框
How to create a symmetrical data frame in R based on another symmetrical dataframe
我有这个数据框。
df <- data.frame(product=c("A", "B", "C", "D", "E"), ID=c(1,1,2,2,1))
和另一个(对称的)数据框。
ID_table <- data.frame("ID 1" = c(10, 50), "ID 2" = c(50, 10))
如何根据 ID 的值创建 5 x 5 产品级数据框?
这是所需的输出:
A到B的编号是10,因为A和B的ID相同=1。
A到C的数字是50,因为A的ID是1,C的ID是2。
您可以使用 table
和 tcrossprod
得到以下内容
out <- tcrossprod(table(df))
out
# product
#product A B C D E
# A 1 1 0 0 1
# B 1 1 0 0 1
# C 0 0 1 1 0
# D 0 0 1 1 0
# E 1 1 0 0 1
现在您只需将值替换为 10
和 50
as.data.frame(ifelse(out == 1, 10, 50))
# A B C D E
#A 10 10 50 50 10
#B 10 10 50 50 10
#C 50 50 10 10 50
#D 50 50 10 10 50
#E 10 10 50 50 10
table(df)
的结果是
table(df)
# ID
#product 1 2
# A 1 0
# B 1 0
# C 0 1
# D 0 1
# E 1 0
而tcrossprod(table(df))
的结果与
相同
table(df) %*% t(table(df))
这是尝试使用 outer
生成每个 df$ID
的组合,并使用它们对您的 ID_table
:
进行子集化
idnm <- setNames(df$ID,df$product)
o <- outer(idnm, idnm, FUN=function(x,y) ID_table[cbind(x,y)] )
o
# A B C D E
#A 10 10 50 50 10
#B 10 10 50 50 10
#C 50 50 10 10 50
#D 50 50 10 10 50
#E 10 10 50 50 10
我有这个数据框。
df <- data.frame(product=c("A", "B", "C", "D", "E"), ID=c(1,1,2,2,1))
和另一个(对称的)数据框。
ID_table <- data.frame("ID 1" = c(10, 50), "ID 2" = c(50, 10))
如何根据 ID 的值创建 5 x 5 产品级数据框?
这是所需的输出:
A到B的编号是10,因为A和B的ID相同=1。 A到C的数字是50,因为A的ID是1,C的ID是2。
您可以使用 table
和 tcrossprod
得到以下内容
out <- tcrossprod(table(df))
out
# product
#product A B C D E
# A 1 1 0 0 1
# B 1 1 0 0 1
# C 0 0 1 1 0
# D 0 0 1 1 0
# E 1 1 0 0 1
现在您只需将值替换为 10
和 50
as.data.frame(ifelse(out == 1, 10, 50))
# A B C D E
#A 10 10 50 50 10
#B 10 10 50 50 10
#C 50 50 10 10 50
#D 50 50 10 10 50
#E 10 10 50 50 10
table(df)
的结果是
table(df)
# ID
#product 1 2
# A 1 0
# B 1 0
# C 0 1
# D 0 1
# E 1 0
而tcrossprod(table(df))
的结果与
table(df) %*% t(table(df))
这是尝试使用 outer
生成每个 df$ID
的组合,并使用它们对您的 ID_table
:
idnm <- setNames(df$ID,df$product)
o <- outer(idnm, idnm, FUN=function(x,y) ID_table[cbind(x,y)] )
o
# A B C D E
#A 10 10 50 50 10
#B 10 10 50 50 10
#C 50 50 10 10 50
#D 50 50 10 10 50
#E 10 10 50 50 10