如果在另一个数据帧中标记,则替换Dataframe中的值

时间:2012-06-24 14:24:16

标签: r loops merge replace

我在一个名为'values'的数据框中有一些值

即:

Sam Ned Ted Ann
500 430 57  212
410 265 69  341
189 554 153 457
236 311 590 271
50  568 234 442

一些质量控制标志位于单独的数据帧“标志”

Sam$F   Ned$F   Ted$F   Ann$F
1   1   1   0 
0   0   1   0
0   0   1   0
0   0   0   0
0   0   1   0

如果flags中的等效条目为1,则我想用'NA'替换'values'中的数字,即产生以下结果

Sam Ned Ted Ann
NA  NA  NA  212
410 265 NA  341
189 554 NA  457
236 311 590 271
50  568 NA  442

这个问题与此问题非常相似:Replacing certain values in data.frame in R

使用'合并表'解决方案已经巧妙地解决了这个问题。

除了我有很多数据列来执行此操作,而不仅仅是一个。但是,我应该能够获得相同的“合并表”解决方案,以便为我工作。

要合并2个表(并用NA替换1,我使用了以下

F2 <-Flags
F2[F2 == "1"] <- "NA"
# Create identical column names for values and F2 for matching
samples <-colnames(Rvalues)
colnames(F2) <-samples
#Create an ID column for F2 and values
F2$ID <- c(1,2,3,4,5)
Rvalues$ID <- c(1,2,3,4,5)
out2 <- merge(Rvalues, F2, by = c("ID"), all.x = TRUE)

得到的out2数据帧如下:

ID  Sam.x   Ned.x   Ted.x   Ann.x   Sam.y   Ned.y   Ted.y   Ann.y 
1   1   500 430 57  212 NA  NA  NA  0
2   2   410 265 69  341 0   0   NA  0
3   3   189 554 153 457 0   0   NA  0
4   4   236 311 590 271 0   0   0   0
5   5   50  568 234 442 0   0   NA  0

所以我想在上面的链接中使用已发布的解决方案(由Chase发布),在循环内遍历每个样本的列。

我尝试了以下内容:

for [i in samples]
{
out3 <- transform(out2, [i]$new = ifelse(is.na([i].x), [i].y, [i].x), [i].x = NULL, [i].y = NULL)}

无效(错误消息

"Error: unexpected '[' in:
"{
out3 <- transform(out2, newdata = ifelse(is.na(["")

所以我有问题,没有[]括号它也不起作用。

非常感谢任何修复,非常感谢

1 个答案:

答案 0 :(得分:1)

如果您的'values'和'flags'data.frames具有相同的维度和列顺序

values[flags == 1] <- NA