如何基于R中的另一列创建具有多个值的新列

时间:2014-01-08 00:17:43

标签: r dataframe

我在R中有一个名为A.Data的数据框。

它有8个不同的列:platerow, colTOFEXTgreenred,和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

谢谢!

4 个答案:

答案 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.Dataconc带有扩充。然后将其与基于col。

的A.Data合并

答案 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

(我担心这个解决方案可能看起来像混淆。)