我有一個像這樣的資料框:
TS Device1.max Device2.max Device3.max Device4.max
18:02:44 FALSE FALSE TRUE FALSE
18:02:45 TRUE TRUE FALSE FALSE
18:02:46 FALSE FALSE FALSE TRUE
18:02:47 FALSE FALSE FALSE FALSE
18:02:48 FALSE FALSE FALSE FALSE
18:02:49 FALSE FALSE FALSE FALSE
18:02:50 FALSE FALSE FALSE FALSE
18:02:51 FALSE FALSE FALSE FALSE
18:02:52 FALSE FALSE FALSE TRUE
18:02:53 FALSE TRUE FALSE FALSE
18:02:54 FALSE FALSE FALSE FALSE
為了獲得真正的假列,我使用了以下代碼:
df$Device1.max = ifelse(df$Device1 == max(df$Device1), 'true','false')
df$Device2.max = ifelse(df$Device2 == max(df$Device2), 'true','false')
df$Device3.max = ifelse(df$Device3 == max(df$Device3), 'true','false')
df$Device4.max = ifelse(df$Device4 == max(df$Device4), 'true','false')
為簡單起見,我只顯示 4 個設備列。我有大約一百個設備列,我想在其中進行比較。在一百個ifelse陳述句中指定一百個列是不可行的如何使用正則運算式進行比較或指定通用列名假設所有感興趣的設備列將具有某種開頭的名稱,例如device?
然后,我想過濾或找到最大Device.max列滿足條件的行,即它在 /-1 行內為真。從演算法上講,我將創建一個索引列并過濾到僅存在 TRUE 值的資料框。然后我會檢查有多少列在彼此的 1 行內具有索引。在上述情況下,行1,2 & 3有 4 列滿足真實條件,而行9 & 10只有 2 列滿足條件。因此我的預期輸出是:
TS Device1.max Device2.max Device3.max Device4.max
18:02:44 FALSE FALSE TRUE FALSE
18:02:45 TRUE TRUE FALSE FALSE
18:02:46 FALSE FALSE FALSE TRUE
然而,這種方法似乎非常迭代且效率低下。有沒有更好的方法來利用 R 中的資料框函式?
uj5u.com熱心網友回復:
這段代碼應該回答第一個TRUE/FALSE問題
r <- c();
colum <- c();
for (colu in 2:ncol(example_table)){
example_table[ ,colu] <- example_table[ ,colu]==max(example_table[ ,colu]) # returns True/False
val <- which(example_table[ ,colu]==T) # searching for row indexes
r <- append(r,val) # append row indexes
colum <- append(colum,rep(colu,length(val))) # since one column can contain more than one True, repeat that column index and append it
}
true_values <- cbind(r,colum) # just a matrix-like output
出去:
> example_table
V1 V2 V3 V4
1 18:02 5 8 1
2 14:05 7 1 7
3 19:27 7 6 1
# After for:
> example_table
V1 V2 V3 V4
1 18:02 FALSE TRUE FALSE
2 14:05 TRUE FALSE TRUE
3 19:27 TRUE FALSE FALSE
> true_values
r colum
[1,] 2 2
[2,] 3 2
[3,] 1 3
[4,] 2 4
其中r是行索引,colum是包含真值的列索引。請注意,它example_table[ ,colu]==max(example_table[ ,colu])回傳一個TRUE/FALSE值,并注意這colum <- append(colum,rep(colu,length(val)))也是避免未來尺寸問題所必需的。
對于第二個問題,您現在擁有包含TRUE值的行索引。然后,您可以實作一個代碼,當所選行上方和下方的行包含一個TRUE值(any()函式應該是一個不錯的值)時,選擇該行。然后subset()是具有該行索引的原始資料框。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/484966.html
上一篇:列groupby上的資料框直方圖
