[英]R - work on data frame rows based on condition
我試圖了解如何根據條件處理數據幀的行。 擁有這樣的數據框架
> d<-data.frame(x=c(0,1,2,3), y=c(1,1,1,0))
> d
x y
1 0 1
2 1 1
3 2 1
4 3 0
如何為包含零值的所有行添加+1? (請注意,可以在任何列中找到零),因此結果將如下所示:
x y
1 1 2
2 1 1
3 2 1
4 4 1
以下代碼似乎可以完成部分工作,但只是打印采取操作的行,采取的次數(2)...
> for(i in 1:nrow(d)){
+ d[d[i,]==0,]<-d[i,]+1
+ }
> d
x y
1 1 2
2 4 1
3 1 2
4 4 1
我確定有一個簡單的解決方案,也許是一個應用函數?,但我沒有到達那里。
謝謝。
一些可能性:
# 1
idx <- which(d == 0, arr.ind = TRUE)[, 1]
d[idx, ] <- d[idx, ] + 1
# 2
t(apply(d, 1, function(x) x + any(x == 0)))
# 3
d + apply(d == 0, 1, max)
的用法which
為載體,例如which(1:3 > 2)
是相當普遍的,而它是為基質中使用以下:通過指定arr.ind = TRUE
我們得到的是數組索引,即每0坐標:
which(d == 0, arr.ind = TRUE)
row col
[1,] 1 1
[2,] 4 2
由於我們只對出現零的行感興趣,因此我取第一列which(d == 0, arr.ind = TRUE)
並將d[idx, ] <- d[idx, ] + 1
加到這些行中的所有元素中d[idx, ] <- d[idx, ] + 1
。
關於第二種方法, apply(d, 1, function(x) x)
將簡單地逐行進行並返回相同的行而不進行任何修改。 通過any(x == 0)
我們檢查特定行中是否有任何零並獲得TRUE
或FALSE
。 但是,通過寫入x + any(x == 0)
我們可以根據需要將TRUE
或FALSE
分別轉換為1或0。
現在是第三種方法。 d == 0
是一個邏輯矩陣,我們使用apply
來遍歷它的行。 然后,當將max
應用於特定行時,我們再次將TRUE
, FALSE
轉換為1,0並找到最大元素。 當且僅當該行中有任何零時,此元素為1。 因此, apply(d == 0, 1, max)
返回0和1的向量。 最后一點是當我們寫A + b
,其中A
是矩陣而b
是矢量,加法是逐列的。 這樣,通過寫d + apply(d == 0, 1, max)
我們根據需要在d
每一列添加apply(d == 0, 1, max)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.