簡體   English   中英

R中的條件替換

[英]Conditional replacement in R

我在R中有一個數據框,看起來像這樣:

Genes       snps    X0  X1  X2  X3  
2   WASH7P  1_14677 0   2   2   2   
3   WASH7P  1_14684 0   1   2   0   
4   WASH7P  1_14685 0   0   0   0    

是否有可能進行條件替換,以便如果int 2在X0-X3列上的頻率大於0.5,則將2替換為0,將0替換為2? 這樣新的數據框是:

    Genes     snps  X0  X1  X2  X3  
2   WASH7P  1_14677 2   0   0   0   
3   WASH7P  1_14684 0   1   2   0   
4   WASH7P  1_14685 0   0   0   0    

提前致謝!

使用R ,我們可以為以'X'('i1')開頭的列名稱創建索引。 然后,我們基於“ X”列中值為2的rowMeans大於0.5的條件獲得行索引。 我們基於行/列索引對'df1'進行子集lapply(... ,遍歷各列( lapply(... ),然后使用來自library(car) recode將'2'的值替換為'0',將'0'的替換為'2' library(car) 。將輸出分配回'df1'的行/列的子集。

library(car)
i1 <- grep('^X', names(df1))
i2 <- rowMeans(df1[i1]==2)> 0.5
df1[i1][i2,] <- lapply(df1[i1][i2,], recode, '2=0;0=2')
df1
#   Genes    snps X0 X1 X2 X3
#2 WASH7P 1_14677  2  0  0  0
#3 WASH7P 1_14684  0  1  2  0
#4 WASH7P 1_14685  0  0  0  0

數據

df1 <- structure(list(Genes = c("WASH7P", "WASH7P", "WASH7P"),
snps = c("1_14677", 
"1_14684", "1_14685"), X0 = c(0L, 0L, 0L), X1 = c(2L, 1L, 0L), 
X2 = c(2L, 2L, 0L), X3 = c(2L, 0L, 0L)), .Names = c("Genes", 
"snps", "X0", "X1", "X2", "X3"), class = "data.frame",
row.names = c("2", "3", "4"))

另一種可能的方法:

cbind(df[1:2], t(as.data.frame(apply(df[3:ncol(df)], 1, function(x) {
  if(mean(x == 2) > .5) {
    x[x==0] <- 4
    x - 2} else x}))))
#   Genes    snps X0 X1 X2 X3
#2 WASH7P 1_14677  2  0  0  0
#3 WASH7P 1_14684  0  1  2  0
#4 WASH7P 1_14685  0  0  0  0

在函數內部,將4分配給0值。 然后從該行中減去2 ,留下所需的輸出。

如果數據框的名稱結構發生更改,請使用@akrun的列搜索方法。 或者,如果20只是玩具示例,並且重新編碼要復雜得多,則請使用akrun的答案來指定值。 這只是沒有軟件包的另一種方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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