【发布时间】:2013-09-16 16:02:30
【问题描述】:
这是我的示例数据集
set.seed(123)
myd <- data.frame (sub = paste ("S", 1:10, sep = ""), P1 = sample(c(1,-1,2,0), 10, replace = TRUE),
P2 = sample(c(1,-1,2,0), 10, replace = TRUE),
I1 = sample(c(1,-1,2,0), 10, replace = TRUE),
I2 = sample(c(1,-1,2,0), 10, replace = TRUE),
I3 = sample(c(1,-1,2,0), 10, replace = TRUE),
I4 = sample(c(1,-1,2,0), 10, replace = TRUE),
I5 = sample(c(1,-1,2,0), 10, replace = TRUE),
I6 = sample(c(1,-1,2,0), 10, replace = TRUE)
)
myd
sub P1 P2 I1 I2 I3 I4 I5 I6
1 S1 -1 0 0 0 1 1 2 0
2 S2 0 -1 2 0 -1 -1 1 2
3 S3 -1 2 2 2 -1 0 -1 2
4 S4 0 2 0 0 -1 1 -1 1
5 S5 0 1 2 1 1 2 0 -1
6 S6 1 0 2 -1 1 1 -1 1
7 S7 2 1 2 0 1 1 0 -1
8 S8 0 1 2 1 -1 0 0 2
9 S9 2 -1 -1 -1 -1 0 0 -1
10 S10 -1 0 1 1 0 -1 -1 1
以值 P1 和 P2 为条件的不正确值的转换表: -1 是缺失值
Condition P1 P2 The value Incorrect
I 1 1 None
II 1 0 2
III 0 1 2
IV 2 0 2 or 0
V 0 2 2 or 0
VI 2 2 1 or 0
VII 1 2 0
VIII 2 1 0
# if there is -1 in any of the value produce all values NA
IX -1 0 NA
X 0 -1 NA
XI -1 -1 NA
XII -1 2 NA
XIII 2 -1 NA
XIV -1 1 NA
XV 1 -1 NA
以下是data.frame格式的转换表的短代码除了**用于IV,V,VI条件,我不知道如何输入,因为有两个值:
ttable <- data.frame (P1 = c(1,1,0,2,0,2,1,2,-1, 0,-1,-1,2,-1,1),
P2 = c(1,0,1,0,2,2,2,1,0,-1,-1,2,-1,1,1),
errort = c("None", 2,2,2, 2,1,0,0,NA, NA, NA, NA, NA, NA,NA))
我想查看每行 s1 到 s10 的内容,我想检查 P1 和 P2 列中的值并将其与 I1 到 I6 列中的值匹配:
sub P1 P2 I1 I2 I3 I4 I5 I6
1 S1 -1 0 0 0 1 1 2 0
在这种情况下,P1 和 P2 的值之一是 -1,因此所有值都是 NA。
另一种情况:
sub P1 P2 I1 I2 I3 I4 I5 I6
S4 0 2 0 0 -1 1 -1 1
这里P1 = 0,P2 = 2,所以下面的值 I1 = 不正确,I2 = 不正确,I3 = NA,I4 = 正确,I5 = NA,I6 = 正确
可以写成
sub P1 P2 I1 I2 I3 I4 I5 I6
S4 0 2 0 0 -1 1 -1 1
FALSE, FALSE, NA, TRUE, NA, TRUE
此匹配条件 (V) 且 0 或 1 不正确,而 1 正确且缺少 -1
另一种情况:这里P1 = 0,P2 =1,匹配匹配表中的条件(III),所以不正确的值为2。
5 S5 0 1 2 1 1 2 0 -1
FALSE, TRUE, TRUE FALSE TRUE NA
我需要计算 false 的频率,我尝试了很多 if-else 语句,但没有给出所需的输出,我觉得其中很多很混乱,我认为这对于我将使用的大型数据集来说效率不高。
qcfun <- function (x) {
x <- x[3:length(x)]
obs1 = table(c(x, 2, 0, 1, -1))
obs = obs1-1
ov <- NULL
if (x[1] == 1 & x[2] == 0){
ov = round (as.numeric (obs[4]/sum(obs)), 2)
} else {
if (x[1] == 0 & x[2] == 1){
ov = round (as.numeric (obs[4]/sum(obs)), 2)
} else {
if (x[1] == 1 & x[2] == 2){
ov = round (as.numeric (obs[2]/sum(obs)), 2)
} else {
if (x[1] == 2 & x[2] == 1){
ov = round (as.numeric (obs[2]/sum(obs)), 2)
} else {
if (x[1] == 1 & x[2] == 1){
ov = 0
} else {
ov = NA
}
}}}}
return (ov)
}
out1 <- apply(myd, 1,qcfun )
table (out1)
tout1 <- table (out1)
有没有一种快速/有效的方法来做到这一点?
【问题讨论】:
-
你还没有发布你用来创建“翻译表”的代码,那么
2,0是什么意思?这是行不通的。 -
@Carl Witthoft 查看最近的编辑 - 2,0 表示(或者)2 或 0 都不正确。我不明白如何在 data.frame 中输入此条件
-
条件 XV 的 P2 是否应为 -1?
-
哦,这是错字,请参阅更正的表格,谢谢
-
如果该行有
P1和P2匹配条件V,为什么S4行中的值I4和I6不正确?
标签: r loops if-statement