簡體   English   中英

如何基於R中的另一列創建具有多個值的新列

[英]How to create a new column with multiple values based on another column in R

我在R中有一個數據幀,稱為A.Data。

它具有8種不同的列: platerow, colTOFEXTgreenredyellow

以下是數據示例。

> head(A.Data)
    plate row col TOF EXT green red yellow 
1     1   A  12  20  21     2   0      0      
2     1   C  12  20  17     0   1      0      
3     1   C  11  20  17     0   0      1      
4     1   A  10  20  16     1   1      3      
5     1   A  10  20  16     0   0      0      
6     1   A  10  20  15     0   0      0

我試圖將新列添加到A.Data稱為conc (濃度的縮寫)。 名為conc的新列取決於col列中的值。

-If col is 1 or 7, conc should equal to 0
-If col is 2 or 8, conc should equal to 0.5
-If col is 3 or 9, conc should equal to 1
-If col is 4 or 10, conc should equal to 2
-If col is 5 or 11, conc should equal to 4
-If col is 6 or 12, conc should say NA

因此,對於前6行數據,所述conc柱應該說NA, NA, 4, 2, 2, 2 ,因為col用於第一行6列的值是12, 12, 11, 10, 10, 10

我向我的教授尋求幫助,他給了我這個提示:

df$newcol <- rep(1, 1000)將向df數據幀添加一個稱為newcol的新列,並將復制1次1000次

嘗試添加一個濃度為conc的濃度列,該濃度列根據整個列的需要重復復制0, 0.5, 1, 2, 4, NA

這是A.Data$col的摘要,以防您發現它有用...

> summary (A.Data$col)
   1    2    3    4    5    6    7    8    9   10   11   12 NA's 
1128  703  538  256  156   30 2101 1039  741  294   73   60   11

謝謝!

未經測試,但這可能有效

map_column <- rep(c(0, 0.5, 1, 2, 4, NA),2)
df$newcol <- map_column[df$col]

編輯:此代碼背后的想法是: map_column ,它是長度為12的向量,在這里用作數字1到12與向量中的值之間的映射(在數學意義上)。 例如,

map_column[[1]]

返回向量(0)的第一個元素,並且

map_column[[9]]

返回向量(1)的第9個元素,依此類推。 現在,R向量具有一次處理多個輸入的能力,因此

map_column[c(1,9)]

一次性返回這些位置上的對應元素( c(0,1) )。 請注意,使用單個方括號[而不是[[這里。

這可行。

convert <- function(number){
  if(number == 1 | number == 7){return(0)}
  if(number == 2 | number == 8){return(.5)}
  if(number == 3 | number == 9){return(1)}
  if(number == 4 | number == 10){return(2)}
  if(number == 5 | number == 11){return(4)}
  if(number == 6 | number == 12){return(NA)}
}

A.Data$newcol <- do.call(rbind, lapply(A.Data$col, convert))

使用合並。

augment <- data.frame(col=1:12,conc=rep(c(0, 0.5, 1, 2, 4, NA),2))
A.Data  <-merge(A.Data,augment,by="col",sort=F)
A.Data
#   col plate row TOF EXT green red yellow conc
# 1  12     1   A  20  21     2   0      0   NA
# 2  12     1   C  20  17     0   1      0   NA
# 3  11     1   C  20  17     0   0      1    4
# 4  10     1   A  20  16     1   1      3    2
# 5  10     1   A  20  16     0   0      0    2
# 6  10     1   A  20  15     0   0      0    2

這產生與2列中,一個數據幀擴充col對應於colA.Data ,和conc與擴充。 然后將其與基於col的A.Data合並。

這是一種基於數學和邏輯運算的非常不同的方法:

x <- c(1:12, NA) # an example vector including all possible values

floor(2 ^ (z <- x %% 6 - 2)) / 2 * (z + 2 | NA)

結果:

[1] 0.0 0.5 1.0 2.0 4.0  NA 0.0 0.5 1.0 2.0 4.0  NA  NA

(我擔心這種解決方案可能看起來像是迷惑。)

暫無
暫無

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

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