你会如何在R中进行这种棘手的子集化?

时间:2014-03-17 18:07:25

标签: r indexing subset

这个问题可能有一个简单的答案,但我无法弄清楚如何去做。我想以一种不直接的方式对数据框进行子集化。

我有一个包含4列的数据框,用于表示实验结果。第一列具有主题编号,第二列具有项目编号,第三列具有测量类型,第四列具有记录的读取时间。我想替换Value列中的0值,但仅限于特定条件。为了具体化,这里是数据框:

Subject = c(rep("S1",6), rep("S2",6))       #two subjects
Item    = rep(c(rep("I1",3),rep("I2",3)),2) #two items for each subject
Measure = rep(c("ff","fp","tt"),4)          #three different measures for each item
Value   = c(0,33,21,2,45,66,78,4,3,0,25,67) #reading times
df      = data.frame(Subject,Item,Measure,Value)
df

   Subject Item Measure Value
1       S1   I1      ff     0
2       S1   I1      fp    33
3       S1   I1      tt    21
4       S1   I2      ff     2
5       S1   I2      fp    45
6       S1   I2      tt    66
7       S2   I1      ff    78
8       S2   I1      fp     4
9       S2   I1      tt     3
10      S2   I2      ff     0
11      S2   I2      fp    25
12      S2   I2      tt    67 

这是一个棘手的部分!我希望得到 ff 为0的所有情况,并以下列方式修改我的数据框:仅适用于 第一次录制和首次通过测量( ff fp ),我想覆盖Value中的现有值NA,创建一个类似于下面的数据框。数据框的其余部分应保持不变。你会如何以简单的方式实现这一目标?任何建议将不胜感激!

Subject = c(rep("S1",6), rep("S2",6))
Item    = rep(c(rep("I1",3),rep("I2",3)),2)
Measure = rep(c("ff","fp","tt"),4)
Value   = c("NA","NA",21,2,45,66,78,4,3,"NA","NA",67)
dfnew   = data.frame(Subject,Item,Measure,Value)  
dfnew
    Subject Item Measure Value
1       S1   I1      ff    NA
2       S1   I1      fp    NA
3       S1   I1      tt    21
4       S1   I2      ff     2
5       S1   I2      fp    45
6       S1   I2      tt    66
7       S2   I1      ff    78
8       S2   I1      fp     4
9       S2   I1      tt     3
10      S2   I2      ff    NA
11      S2   I2      fp    NA
12      S2   I2      tt    67

2 个答案:

答案 0 :(得分:1)

也许你可以使用which

idx <- with(df, which(Measure=="ff" & Value==0))
df[idx, "Value"] <- NA
idx <- Filter(function(i) df[i, "Measure"]=="fp", idx+1)
df[idx, "Value"] <- NA

答案 1 :(得分:1)

这种感觉就像宽格式比长格式更容易。这样的事怎么样?如果订单很重要,您可以使用最终数据框。

library(reshape2)
d2 <- dcast(Subject + Item ~ Measure, data=df, value.var="Value")
d2
##   Subject Item ff fp tt
## 1      S1   I1  0 33 21
## 2      S1   I2  2 45 66
## 3      S2   I1 78  4  3
## 4      S2   I2  0 25 67
k <- d2$ff==0
d2$ff[k] <- d2$fp[k] <- NA
melt(d2)
## 1       S1   I1       ff    NA
## 2       S1   I2       ff     2
## 3       S2   I1       ff    78
## 4       S2   I2       ff    NA
## 5       S1   I1       fp    NA
## 6       S1   I2       fp    45
## 7       S2   I1       fp     4
## 8       S2   I2       fp    NA
## 9       S1   I1       tt    21
## 10      S1   I2       tt    66
## 11      S2   I1       tt     3
## 12      S2   I2       tt    67