分析列值并在 R 中使用分组因子创建新列的简洁方法

Clean way to analyze column values and make a new column with a grouping factor in R

我想知道是否有一种更简洁的方法来完成我已经完成的工作,这段代码确实有效,但我想探究屋子里的人的专业知识,以便能够以更好的方式做到这一点.

假设我们只是有一些数据,其中有一列参与者的标识符,为了我们的示例,我们将其称为 indiv,因此我们有一个包含 36 个主题的数据框,所有主题都已编号,并且我想每两个人创建一个新列并将其命名为 dyad 和动态编号。

indiv <- c(1:36)
freq <- data.frame(indiv)

freq$ID <-  vector(length = dim(freq)[1])
for (i in 1:nrow(freq)) {
  if (0<freq$indiv[i]&&freq$indiv[i]<=2){freq$ID[i] <- print("dyad01")}
  else if (2<freq$indiv[i]&&freq$indiv[i]<=4){freq$ID[i] <- print("dyad02")} 
  else if (4<freq$indiv[i]&&freq$indiv[i]<=6){freq$ID[i] <- print("dyad03")} 
  else if (6<freq$indiv[i]&&freq$indiv[i]<=8){freq$ID[i] <- print("dyad04")} 
  else if (8<freq$indiv[i]&&freq$indiv[i]<=10){freq$ID[i] <- print("dyad05")} 
  else if (10<freq$indiv[i]&&freq$indiv[i]<=12){freq$ID[i] <- print("dyad06")} 
  else if (12<freq$indiv[i]&&freq$indiv[i]<=14){freq$ID[i] <- print("dyad07")} 
  else if (14<freq$indiv[i]&&freq$indiv[i]<=16){freq$ID[i] <- print("dyad08")} 
  else if (16<freq$indiv[i]&&freq$indiv[i]<=18){freq$ID[i] <- print("dyad09")} 
  else if (18<freq$indiv[i]&&freq$indiv[i]<=20){freq$ID[i] <- print("dyad10")} 
  else if (20<freq$indiv[i]&&freq$indiv[i]<=22){freq$ID[i] <- print("dyad11")} 
  else if (22<freq$indiv[i]&&freq$indiv[i]<=24){freq$ID[i] <- print("dyad12")} 
  else if (24<freq$indiv[i]&&freq$indiv[i]<=26){freq$ID[i] <- print("dyad13")} 
  else if (26<freq$indiv[i]&&freq$indiv[i]<=28){freq$ID[i] <- print("dyad14")} 
  else if (28<freq$indiv[i]&&freq$indiv[i]<=30){freq$ID[i] <- print("dyad15")} 
  else if (30<freq$indiv[i]&&freq$indiv[i]<=32){freq$ID[i] <- print("dyad16")} 
  else if (32<freq$indiv[i]&&freq$indiv[i]<=34){freq$ID[i] <- print("dyad17")} 
  else {freq$ID[i] <- print("dyad18")} 
}

当然这对我有用并且按照我预期的方式完成了工作,但是,我想知道是否有人知道更简洁的方法,只是为了学习和改进。

提前致谢!

您可以使用 sprintf(),因为它可用于对前导数字进行零填充,并通过一些整数除法进行矢量化:

sprintf("dyad%02d", (indiv-1) %/% 2 + 1)

 [1] "dyad01" "dyad01" "dyad02" "dyad02" "dyad03" "dyad03" "dyad04" "dyad04" "dyad05" "dyad05" "dyad06" "dyad06" "dyad07" "dyad07" "dyad08" "dyad08"
[17] "dyad09" "dyad09" "dyad10" "dyad10" "dyad11" "dyad11" "dyad12" "dyad12" "dyad13" "dyad13" "dyad14" "dyad14" "dyad15" "dyad15" "dyad16" "dyad16"
[33] "dyad17" "dyad17" "dyad18" "dyad18"