我在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
,因为前6行的col
列值为12, 12, 11, 10, 10, 10
。
我向我的教授求助,他给了我这个提示:
df$newcol <- rep(1, 1000)
会在名为df
的{{1}}数据框中添加一个新列,并且会复制1000次
尝试添加一个名为newcol
的浓度列,其中conc
复制了整个列所需的次数。
以下是0, 0.5, 1, 2, 4, NA
的摘要,以防您觉得有用......
A.Data$col
谢谢!
答案 0 :(得分:5)
未经测试,但这可能有效
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)
)。请注意,在此处使用单个方括号[
而不是[[
非常重要。
答案 1 :(得分: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))
答案 2 :(得分:1)
使用合并。
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。
答案 3 :(得分:0)
这是一种基于数学和逻辑运算的非常不同的方法:
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
(我担心这个解决方案可能看起来像混淆。)