如何将数据帧转换为 R 中的对数?
How to turn dataframe into pair count in R?
我是 R 的新手,我正在为 class 做期末作业。我在整理数据时遇到了一些问题。
例如,我有如下数据框。
StudentId table_wk1 table_wk2 table_wk3
0034 1 1 2
0067 1 1 1
0098 1 2 2
0079 2 2 1
我想要实现的是将这个数据框变成下面的数组。每当两个学生选择相同的 table 时,他们之间就会有一个计数,所以就像:
0034 0067 2
0034 0098 2
0034 0079 0
0067 0098 1
0067 0079 1
0098 0079 1
谢谢!如果我的问题不清楚,请告诉我。这是我的第一个问题。
如果我理解你的请求是正确的,那么当两个学生 ID 之间的 table_wk
值相同时,就会开始计数。
下面的代码基本上是为学生 ID 的组合创建一个新的数据框(您也可以为此使用 gtools
或 combinat
包),然后根据两者的比较计算结果组合方
# Generate data
df <- data.frame(StudentId = c("0034", "0067", "0098", "0079"),
table_wk1 = c(1, 1, 1, 2),
table_wk2 = c(1, 1, 2, 2),
table_wk3 = c(2, 1, 2, 1),
stringsAsFactors = F)
# Process data
df2 <- as.data.frame(t(combn(df$StudentId, 2)), stringsAsFactors = F)
df2.1 <- merge(df2[-2], df, by.x = 'V1', by.y = 'StudentId', sort = F)
df2.2 <- merge(df2[-1], df, by.x = 'V2', by.y = 'StudentId', sort = F)
df2.2 <- df2.2[match(df2$V2, df2.2$V2),] # Solve the sorting issue due to merge
# Create result
df2$Result <- rowSums(df2.1[-1] == df2.2[-1])
首先创建所有可能的学生组合
df$StudentId = as.character(df$StudentId)
df_new=data.frame(t(combn(df$StudendId,2)))
> df_new
X1 X2
1 0034 0067
2 0034 0098
3 0034 0079
4 0067 0098
5 0067 0079
6 0098 0079
现在,使用 apply 函数循环遍历 df_new 中的每一行,将 2 个学生 ID 与 df 中的相应行相匹配,并找出这两行在哪些列中相等。
df_new$Value_Count = apply(df_new,1, function(x) sum(df[df$StudendId == x[1],2:4] == df[df$StudendId == x[2],2:4]))
> df_new
X1 X2 Value_Count
1 0034 0067 2
2 0034 0098 2
3 0034 0079 0
4 0067 0098 1
5 0067 0079 1
6 0098 0079 1
我是 R 的新手,我正在为 class 做期末作业。我在整理数据时遇到了一些问题。 例如,我有如下数据框。
StudentId table_wk1 table_wk2 table_wk3
0034 1 1 2
0067 1 1 1
0098 1 2 2
0079 2 2 1
我想要实现的是将这个数据框变成下面的数组。每当两个学生选择相同的 table 时,他们之间就会有一个计数,所以就像:
0034 0067 2
0034 0098 2
0034 0079 0
0067 0098 1
0067 0079 1
0098 0079 1
谢谢!如果我的问题不清楚,请告诉我。这是我的第一个问题。
如果我理解你的请求是正确的,那么当两个学生 ID 之间的 table_wk
值相同时,就会开始计数。
下面的代码基本上是为学生 ID 的组合创建一个新的数据框(您也可以为此使用 gtools
或 combinat
包),然后根据两者的比较计算结果组合方
# Generate data
df <- data.frame(StudentId = c("0034", "0067", "0098", "0079"),
table_wk1 = c(1, 1, 1, 2),
table_wk2 = c(1, 1, 2, 2),
table_wk3 = c(2, 1, 2, 1),
stringsAsFactors = F)
# Process data
df2 <- as.data.frame(t(combn(df$StudentId, 2)), stringsAsFactors = F)
df2.1 <- merge(df2[-2], df, by.x = 'V1', by.y = 'StudentId', sort = F)
df2.2 <- merge(df2[-1], df, by.x = 'V2', by.y = 'StudentId', sort = F)
df2.2 <- df2.2[match(df2$V2, df2.2$V2),] # Solve the sorting issue due to merge
# Create result
df2$Result <- rowSums(df2.1[-1] == df2.2[-1])
首先创建所有可能的学生组合
df$StudentId = as.character(df$StudentId)
df_new=data.frame(t(combn(df$StudendId,2)))
> df_new
X1 X2
1 0034 0067
2 0034 0098
3 0034 0079
4 0067 0098
5 0067 0079
6 0098 0079
现在,使用 apply 函数循环遍历 df_new 中的每一行,将 2 个学生 ID 与 df 中的相应行相匹配,并找出这两行在哪些列中相等。
df_new$Value_Count = apply(df_new,1, function(x) sum(df[df$StudendId == x[1],2:4] == df[df$StudendId == x[2],2:4]))
> df_new
X1 X2 Value_Count
1 0034 0067 2
2 0034 0098 2
3 0034 0079 0
4 0067 0098 1
5 0067 0079 1
6 0098 0079 1