-1

我在问一个关于我从@redmode 在这里学到的方法的附带问题:

基于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")
4

1 回答 1

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
于 2013-03-01T00:10:57.253 回答