我在这里问了一个关于我从@redmode学到的方法的问题:
Subsetting based on values of a different data frame in R
当我尝试通过以下方式动态调整我想要的级别时:
N <- nrow(A)
cond <- sapply(3:N, function(i) sum(A[i,] > 0.95*B[i,])==2)
rbind(A[1:2,], subset(A[3:N,], cond))
我收到错误
Error in FUN(left, right) : non-numeric argument to binary operator.
您能想到一种方法,我可以获得与A中的值相关的行,这些行大于B中值的95%吗?谢谢。
以下是A和B的代码。
A <- structure(list(name1 = c("trt", "0", "1", "10", "1", "1", "10"
), name2 = c("ctrl", "3", "1", "1", "1", "1", "10")), .Names = c("name1",
"name2"), row.names = c("cond", "hour", "A", "B", "C", "D", "E"
), class = "data.frame")
B <- structure(list(name1 = c("trt", "0", "1", "1", "1", "1", "9.4"),
name2 = c("ctrl", "3", "1", "10", "1", "1", "9.4")), .Names = c("name1",
"name2"), row.names = c("cond", "hour", "A", "B", "C", "D", "E"
), class = "data.frame")
答案 0 :(得分:1)
您的数据存在严重的格式问题。
首先,列应该是相同的数据类型,行应该是观察。 (并非总是如此,但这是一个非常好的开始方式)这里有一行名为cond
,然后是一行hour
,然后是我猜的一系列分类。您开始使用数据的方式没有多大意义,也不适合轻松操作数据。但一切都不会丢失。这就是我要做的事情:
重新组织我的数据:
C <- data.frame(matrix(as.numeric(unlist(A)), ncol=2)[-(1:2), ])
colnames(C) <- c('A.trt', 'A.cntr')
rownames(C) <- LETTERS[1:nrow(C)]
D <- data.frame(matrix(as.numeric(unlist(B)), ncol=2)[-(1:2), ])
colnames(D) <- c('B.trt', 'B.cntr')
(df <- cbind(C, D))
给出了:
# A.trt A.cntr B.trt B.cntr
# A 1 1 1.0 1.0
# B 10 1 1.0 10.0
# C 1 1 1.0 1.0
# D 1 1 1.0 1.0
# E 10 10 9.4 9.4
然后你的问题很容易解决:
df[which(df[, 1] > 0.95*df[, 3] & df[, 2] > 0.95*df[, 4]), ]
# A.trt A.cntr B.trt B.cntr
# A 1 1 1.0 1.0
# C 1 1 1.0 1.0
# D 1 1 1.0 1.0
# E 10 10 9.4 9.4