簡體   English   中英

R - 根據條件處理數據幀行

[英]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)我們檢查特定行中是否有任何零並獲得TRUEFALSE 但是,通過寫入x + any(x == 0)我們可以根據需要將TRUEFALSE分別轉換為1或0。

現在是第三種方法。 d == 0是一個邏輯矩陣,我們使用apply來遍歷它的行。 然后,當將max應用於特定行時,我們再次將TRUEFALSE轉換為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM