[英]How to create a new column with multiple values based on another column in R
我在R中有一個數據幀,稱為A.Data。
它具有8種不同的列: plate
, row,
col
, TOF
, EXT
, green
, red
和yellow
。
以下是數據示例。
> 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
對應於col
在A.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.