根据条件在R中添加列

时间:2015-10-14 12:46:50

标签: r

我有一个包含3列的数据框。我需要添加2个新列,取决于第三列中是否有0/1或1/1。如果是0/1,则输出为 相同但在1/1的情况下,它将是输出的第一列与第二列相同。感谢任何帮助。

示例:

G   A   0/1  -->   G   A
C   T   0/1  -->   C   T
A   G   1/1  -->   G   G
C   G   1/1  -->   G    G
T   C   1/1  -->   C    C
A   G   1/1  -->   G    G
G   A   0/1  -->   G    A
A   G   1/1  -->   G    G

3 个答案:

答案 0 :(得分:2)

这应该做你想要的:

df$new1 <- +(df$V1==df$V2)
df$new2 <- 1

或(受@ arkun回答的启发):

df <- cbind(df, new1 = +(df$V1==df$V2), new2 = 1)

这给出了以下数据帧:

> df
  V1 V2 new1 new2
1  A  A    1    1
2  A  G    0    1
3  T  T    1    1
4  C  C    1    1
5  A  C    0    1
6  A  G    0    1
7  G  G    1    1

使用过的数据:

df <- read.table(text="A    A 
A    G  
T    T  
C    C  
A    C  
A    G 
G    G", header=FALSE)

对于新示例:

df$new1 <- ifelse(df$V3=="0/1", as.character(df$V1), as.character(df$V2))
df$new2 <- df$V2

这给出了:

> df
  V1 V2  V3 new1 new2
1  G  A 0/1    G    A
2  C  T 0/1    C    T
3  A  G 1/1    G    G
4  C  G 1/1    G    G
5  T  C 1/1    C    C
6  A  G 1/1    G    G
7  G  A 0/1    G    A
8  A  G 1/1    G    G

使用过的数据:

df <- structure(list(V1 = structure(c(3L, 2L, 1L, 2L, 4L, 1L, 3L, 1L), .Label = c("A", "C", "G", "T"), class = "factor"), 
                     V2 = structure(c(1L, 4L, 3L, 3L, 2L, 3L, 1L, 3L), .Label = c("A", "C", "G", "T"), class = "factor"),
                     V3 = structure(c(1L, 1L, 2L, 2L, 2L, 2L, 1L, 2L), .Label = c("0/1", "1/1"), class = "factor")),
                .Names = c("V1", "V2", "V3"), class = "data.frame", row.names = c(NA, -8L))

答案 1 :(得分:1)

一种选择是通过添加1将逻辑向量(df1[,1]==df1[,2])转换为数字索引,使用它来填充字符串0 11 1并使用{{1}进行读取创建两列。

read.table

或者只使用read.table(text=c('0 1', '1 1')[(df1[,1]==df1[,2])+1L], header=FALSE) # V1 V2 #1 1 1 #2 0 1 #3 1 1 #4 1 1 #5 0 1 #6 0 1 #7 1 1 ,因为第二列始终为1。

cbind

更新

对于第二个示例(@ Jaap的数据集),我们还可以使用cbind(df1[,1]==df1[,2],1) 索引来创建&#39; new1&#39;专栏和&#39; new2&#39;与&#39; V2&#39;基本相同(不知道为什么需要重复的列)。

row/column

数据

transform(df, new1 = df[2:1][cbind(1:nrow(df),(V3=='0/1')+1L)],
              new2 = df[,2])
#  V1 V2  V3 new1 new2
#1  G  A 0/1    G    A
#2  C  T 0/1    C    T
#3  A  G 1/1    G    G
#4  C  G 1/1    G    G
#5  T  C 1/1    C    C
#6  A  G 1/1    G    G
#7  G  A 0/1    G    A
#8  A  G 1/1    G    G

答案 2 :(得分:1)

您可以使用dplyrtidyr

library(dplyr)
library(tidyr)
z %>% separate(V3, into = c("col1", "col2"), remove = FALSE) %>%
    mutate_each(funs(ifelse(. == 0, as.character(V1), as.character(V2))), -V1, -V2, -V3)
  V1 V2  V3 col1 col2
1  G  A 0/1    G    A
2  C  T 0/1    C    T
3  A  G 1/1    G    G
4  C  G 1/1    G    G
5  T  C 1/1    C    C
6  A  G 1/1    G    G
7  G  A 0/1    G    A
8  A  G 1/1    G    G