遍历多列

时间:2018-09-27 13:49:54

标签: r loops for-loop

我有一个与此类似的数据框:

ID <- rep(c("1k", "2k", "3k", "4k"), 2)
Type <- c(rep("D",4), rep("G",4))
Values1 <- c(1, 0, 0, 1, 1, 0, 1, 1)
Values2 <- c(0, 1, 1, 1, NA, NA, NA, NA)
dtf <- data.frame(ID, Type, Values1, Values2)

我想创建一个循环,该循环通过列ID,将“ D”类型的所有项目的Values1中的项目应用到“ G”类型的项目的Values2列中。例如,1kG的Values2应该为1,因为1kD中的Values1为1,2kG的Values2应该为0,因为2kD中的Values1为0,等等。 最终的数据帧应如下所示:

#   ID Type Values1 Values2
# 1 1k    D       1       0
# 2 2k    D       0       1
# 3 3k    D       0       1
# 4 4k    D       1       1
# 5 1k    G       1       1
# 6 2k    G       0       0
# 7 3k    G       1       0 
# 8 4k    G       1       1

2 个答案:

答案 0 :(得分:0)

这是使用for循环的简单但不是很快的实现。您的data.frame在实际情况下有多大?

# Initialise your example data (note I have converted to a data.frame)
ID <- rep(c("1k", "2k", "3k", "4k"), 2)
Type <- c(rep("D",4), rep("G",4))
Values1 <- c(1, 0, 0, 1, 1, 0, 1, 1)
Values2 <- c(0, 1, 1, 1, NA, NA, NA, NA)
dtf <- data.frame(ID, Type, Values1, Values2, stringsAsFactors = FALSE)

# Loop over IDs and overwrite Value2 where 
for (id in dtf$ID) {
  dtf$Values2[id == dtf$ID & dtf$Type == "G"] <-
    dtf$Values1[id == dtf$ID & dtf$Type == "D"]
}

print(dtf)
  #ID Type Values1 Values2
#1 1k    D       1       0
#2 2k    D       0       1
#3 3k    D       0       1
#4 4k    D       1       1
#5 1k    G       1       1
#6 2k    G       0       0
#7 3k    G       1       0
#8 4k    G       1       1

请注意,它假定每个ID和每个类型只有一条记录。

答案 1 :(得分:0)

不需要for循环,替换已经矢量化。

dtf
#   ID Type Values1 Values2
# 1 1k    D       1       0
# 2 2k    D       0       1
# 3 3k    D       0       1
# 4 4k    D       1       1
# 5 1k    G       1      NA
# 6 2k    G       0      NA
# 7 3k    G       1      NA
# 8 4k    G       1      NA

dtf[dtf$Type == "G", "Values2"] <- dtf[dtf$Type == "D", "Values1"]

dtf
#   ID Type Values1 Values2
# 1 1k    D       1       0
# 2 2k    D       0       1
# 3 3k    D       0       1
# 4 4k    D       1       1
# 5 1k    G       1       1
# 6 2k    G       0       0
# 7 3k    G       1       0
# 8 4k    G       1       1