基于R中不同数据帧的调整值进行子集化时出错

时间:2013-02-28 23:00:44

标签: r formatting conditional dataframe subset

我在这里问了一个关于我从@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")

1 个答案:

答案 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