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