生成一系列列,这些列的值等于另一行中的列的值

时间:2019-07-02 01:27:16

标签: r

假设我有以下数据集:

data = read.table(text = "teamID quiz.1.answer quiz.1.solution quiz.2.answer quiz.2.solution
          1 2 2 4 4
          1 3 2 1 4", header = T)

> data
  teamID quiz.1.answer quiz.1.solution quiz.2.answer quiz.3.solution
1      1             2               2             4               4
2      1             3               2             1               4

我想为团队中的每个人(具有相同唯一teamID的个人)创建一列,该列对应于其团队中其他人的值。因此,例如:

data_final = read.table(text = "teamID quiz.1.answer quiz.1.solution quiz.2.answer quiz.2.solution partner_quiz.1.answer partner_quiz.1.solution partner_quiz.2.answer partner_quiz.2.solution
          1 2 2 4 4 3 2 1 4
          1 3 2 1 4 2 2 4 4", header = T)

具有以下输出:

> data_final
  teamID quiz.1.answer quiz.1.solution quiz.2.answer quiz.2.solution partner_quiz.1.answer partner_quiz.1.solution
1      1             2               2             4               4                     3                       2
2      1             3               2             1               4                     2                       2
  partner_quiz.2.answer partner_quiz.2.solution
1                     1                       4
2                     4                       4

所有相关列都将以“答案”或“解决方案”作为后缀。将永远只有两个人的团队。

我可以使用以下代码逐个变量地模拟此行为。但是,在实际的数据集中,我有100多个测验问题和解决方案,因此需要找到一种方法来对与特定正则表达式查询匹配的变量执行此操作。即,测验。[数字1-100]。答案或解决方案

data <- transform(data,partner_quiz.1.answer=ave(quiz.1.answer,teamID,FUN=rev))

3 个答案:

答案 0 :(得分:4)

如果您知道每个组中只有2个人,请切换行,然后覆盖到新的变量块:

driver.find_element_by_css_selector("div[class^='dd algo algo-sr']")

答案 1 :(得分:4)

data.table解决方案:

dt <- data.table(df)

newcols <- paste0("partner_", names(dt)[2:5])

dt[, c(newcols) := .SD[order(-.I)], by = teamID]

c(newcols) :=分配给在newcols中命名的列。它分配.SD的内容,该内容恰好是数据的子集(因此是SD),在这种情况下,是为每个teamID过滤的数据。 [order(-.I)] 颠倒子集的顺序(.IteamID组中的第i个元素),因此order(-.I)将把学生首先#2,然后#1。 by部分很容易说明。

使用的数据:

df = read.table(text = "teamID quiz.1.answer quiz.1.solution quiz.2.answer quiz.2.solution
1 2 2 4 4
1 3 2 1 4", header = T)

请注意,我避免使用data,因为它是utils包中函数的名称。

答案 2 :(得分:2)

使用dplyr,我们可以按组反转行号,重命名列,然后将此数据框绑定到原始数​​据框。

library(dplyr)

bind_cols(data, data %>%
                 group_by(teamID) %>%
                 slice(n() : 1) %>%
                 ungroup() %>%
                 select(-teamID) %>%
                 rename_all(~paste0("partner_", .)))

#  teamID quiz.1.answer quiz.1.solution quiz.2.answer quiz.2.solution partner_quiz.1.answer
#1      1             2               2             4               4                     3
#2      1             3               2             1               4                     2

#  partner_quiz.1.solution partner_quiz.2.answer partner_quiz.2.solution
#1                       2                     1                       4
#2                       2                     4                       4

如果还有其他列,我们只选择以"solution""answer"结尾的列,我们可以在matches中使用select

bind_cols(data, data %>%
     select(teamID, matches("answer$|solution$")) %>%
     group_by(teamID) %>%
     slice(n() : 1) %>%
     ungroup() %>%
     select(-teamID) %>%
    rename_all(~paste0("partner_", .)))