我有一个包含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
答案 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 1
,1 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)
您可以使用dplyr
和tidyr
:
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