我有一个与此类似的数据框:
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
答案 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