2014-03-28 22 views
0
x <- c("a", 2, 3, 1.0) 
y <- c("b", 1, 6, 7.9) 
z <- c("c", 1, 8, 2.0) 
p <- c("d", 2, 9, 3.3) 

df1 <- data.frame(x,y,z,p) 

這是一個快速的示例數據集,但它並不完全反映我即將做的事情。假設我想從第2行的每個因子水平採集50個隨機樣本(在這種情況下,我們只有2個因子水平)......我將如何去有效地編碼?我有一個版本的工作循環,但它感覺不必要的複雜如何按行中的因子子集?

編輯:當我說我想採取50個隨機樣本,我的意思是從該因子的每個級別50列。

+0

也許是我的,但是這是很難理解的。 –

+0

@RichardScriven這不僅僅是你。 – joran

+0

因此,在這個數據框的第2行中,我們有因子1和2.我想要在第2行中包含1個50個隨機列以及包含2個在第2行中的50個隨機列。我希望這些列處於完成時的相同數據幀 - 不像分割函數的結果 – user2795569

回答

1

您需要提取一個因子(假設第二行是一個因子)。

fact <- as.factor(as.matrix(df1[2,])) 

然後與你想成爲一個因素的第二列一起工作。例如,樣品全部爲因素

df1[,df1[2,]==levels(fact)[1],] 

的第一個值或整整50獲得:

df1[,df1[2,]==levels(fact)[1],][1:50] 
+0

代碼運行的方式我將轉置數千幀的數據幀。在這種情況下,可能不是最好的辦法。 – user2795569

+0

這是真的,但這是我能想到的唯一方法,如果你不知道,哪些列將對應一個因素。因爲接受的答案是基於要採樣的列的預定義索引,並且這種方式(如果更通用) –

+0

OK,它看起來像生病不得不編寫代碼來確定爲每個級別採樣哪些列。 – user2795569

1

也許你希望做這樣的事情:

x1 <- df1[,sample(c(1,4),50,replace = TRUE)] 
x2 <- df1[,sample(c(2,3),50,replace = TRUE)] 

...但你的問題是非常混亂。 「因素」是指R中非常具體的東西:一種通常存儲在數據框的列中的變量,而不是一行。此外,你似乎強迫所有的列自己是因素(或字符可能),這似乎是一種奇怪的方式來存儲值3.3

+0

這就是我正在尋找的內容。我從來沒有使用R足以在使用之間保留許多有用的信息。你能解釋代碼的c(1,4)和c(2,3)部分在做什麼嗎?有沒有辦法讓第2行的值超過20級? – user2795569

+0

我想我明白了。您正在指定要採樣的列。我需要做邏輯上不手動..如果你知道我的意思。 – user2795569