2013-02-28 56 views
-1

我問我在這裏學到從@redmode方法的副作用問題,不同的數據幀的調整值子集化時:錯誤基於R中

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

你能提供A,B的小例子以及你的結果應該是什麼。看起來可能A和B是單列數據框架?你想保持行1和2在A中的所有行的大於B的對應行的95%嗎? – N8TRO 2013-02-28 23:10:48

+0

您的數據是全部字符。 'class(B [1,2])''#[1]「character」'你的行缺點和小時應該是列名的一部分。 – N8TRO 2013-02-28 23:40:34

回答

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 
+0

感謝您的幫助,但我的真實數據有數百行,我不想逐個索引它們。是的,我的數據組織得不好。我希望我知道如何使小時和冷水成爲因素。像重塑的融化命令可能會有所幫助。 – chimpsarehungry 2013-03-01 05:16:46

+0

@chimpsarehungry這可以很容易地泛化,也許如果你用真正代表數據的樣本數據發佈一個新問題。真正的想法是不混合數據類型並對其進行組織,以便後續操作非常簡單。 – N8TRO 2013-03-02 03:12:43