我的数据集包含两列数据偏移的列 - 类似于:
col1<-c("a", "b", "c", "d", "ND", "ND", "ND", "ND")
col2<-c("ND", "ND", "ND", "ND", "e", "f", "g", "h")
dataset<-data.frame(cbind(col1, col2))
我想将这两个偏移列组合成一个包含字母a到h的列,而不是其他任何内容。
以下是我的想法,但是rbind不是正确的命令:
dataset$combine<-rbind(dataset$col1[1:4], dataset$col2[5:8])
答案 0 :(得分:2)
怎么样:
sel2 <- col2!="ND"
col1[sel2] <- col2[sel2]
> col1
[1] "a" "b" "c" "d" "e" "f" "g" "h"
答案 1 :(得分:2)
使用sapply
和匿名函数:
dataset[sapply(dataset, function(x) x != "ND")]
# [1] "a" "b" "c" "d" "e" "f" "g" "h"
dataset$combine <- dataset[sapply(dataset, function(x) x != "ND")]
dataset
# col1 col2 combine
# 1 a ND a
# 2 b ND b
# 3 c ND c
# 4 d ND d
# 5 ND e e
# 6 ND f f
# 7 ND g g
# 8 ND h h
答案 2 :(得分:2)
使用grep
查找匹配的元素并选择它们:
c(col1[grep("^[a-h]$",col1)],col2[grep("^[a-h]$",col2)])
答案 3 :(得分:2)
另一种方式,使用mapply
和gsub
:
within(dataset, combine <- mapply(gsub, pattern='ND', replacement=col2, x=col1))
# col1 col2 combine
# 1 a ND a
# 2 b ND b
# 3 c ND c
# 4 d ND d
# 5 ND e e
# 6 ND f f
# 7 ND g g
# 8 ND h h
根据您对@Andrie的答案的评论,这也将保留NA
行。
答案 4 :(得分:1)
另一种观点:
transform(dataset,
combine=dataset[apply(dataset, 2, function(x) x %in% letters[1:8])])
col1 col2 combine
1 a ND a
2 b ND b
3 c ND c
4 d ND d
5 ND e e
6 ND f f
7 ND g g
8 ND h h
dataset$combine <- dataset[apply(dataset,2, function(x) nchar(x)==1)] #Also works
答案 5 :(得分:0)
有时候问题就是思考得足够简单......; - )
dataset$combine<-c(dataset$col1[1:4], dataset$col2[5:8])