将字符列合并到新列中

时间:2014-05-22 08:30:14

标签: r merge dataframe concatenation

如果您能通过几次测试后仍然能够帮助我,我将非常感激。我仍然无法获得正确的结果。

我有这些数据:

dd_1 <- data.frame(ID = c("1","2", "3", "4", "5"),
                 Class_a = c("a",NA, "a", NA, NA),
                 Class_b = c(NA, "b", "b", "b", "b"))

我想制作一个新专栏'CLASS':

dd_2 <- data.frame(ID = c("1","2", "3", "4", "5"),
                 Class_a = c("a",NA, "a", NA, NA),
                 Class_b = c(NA, "b", "b", "b", "b"),
                 CLASS = c("a", "b", "a-b", "b", "b"))

非常感谢!

3 个答案:

答案 0 :(得分:2)

这是:

tmp <- paste(dd_1$Class_a, dd_1$Class_b, sep='-')
tmp <- gsub('NA-|-NA', '', tmp)
(dd_2 <- cbind(dd_1, tmp))

首先,我们将2列连接起来(以字符串形式连接)。 pasteNA视为普通字符串,即"NA",因此我们要么NA-aNA-ba-b。然后我们用空字符串替换NA--NA

结果是:

##   ID Class_a Class_b tmp
## 1  1       a    <NA>   a
## 2  2    <NA>       b   b
## 3  3       a       b a-b
## 4  4    <NA>       b   b
## 5  5    <NA>       b   b

答案 1 :(得分:1)

另一种选择:

dd_1$CLASS <- with(dd_1, ifelse(is.na(Class_a), as.character(Class_b),
                               ifelse(is.na(Class_b), as.character(Class_a), 
                                        paste(Class_a, Class_b, sep="-"))))

通过这种方式,您可以检查是否有任何类是NA并返回另一个类,或者,如果没有NA,则返回两个以“ - ”分隔的类。

答案 2 :(得分:0)

这是apply的简短解决方案:

dd_2 <- cbind(dd_1, CLASS = apply(dd_1[2:3], 1, 
                                  function(x) paste(na.omit(x), collapse = "-")))

结果

  ID Class_a Class_b CLASS
1  1       a    <NA>     a
2  2    <NA>       b     b
3  3       a       b   a-b
4  4    <NA>       b     b
5  5    <NA>       b     b