转换R中数据帧的格式

时间:2014-11-30 07:40:53

标签: r

我有一个以下格式的数据文件

id     col1     col2     col3

1      abc      abc2     
2      abc      abc3     abc2
3      abc2

我想将其转换为以下内容:

id    abc     abc2     abc3

1     TRUE    TRUE     FALSE
2     TRUE    TRUE     TRUE
3     FALSE   TRUE     FALSE

如何使用R(或其他任何东西)执行此操作?任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

您也可以

library(dplyr)
library(tidyr)

df1 <- df %>% 
            gather(Var, Val, col1:col3) %>%
            filter(grepl('[^ ]+', Val)) %>%
            spread(Val, Var)

df1[,-1] <- !is.na(df1[,-1])
df1
#  id   abc abc2  abc3
#1  1  TRUE TRUE FALSE
#2  2  TRUE TRUE  TRUE
#3  3 FALSE TRUE FALSE

数据

df <- data.frame(col1= c('abc', 'abc', 'abc2'),
      col2= c('abc2', 'abc3', ' '), col3=c('   ', 'abc2', ''))

答案 1 :(得分:1)

df <- data.frame(col1=c('abc','abc','abc2'),
                 col2=c('abc2','abc3',''),
                 col3=c('','abc2','') )

df != ''
     col1  col2  col3
[1,] TRUE  TRUE FALSE
[2,] TRUE  TRUE  TRUE
[3,] TRUE FALSE FALSE

答案 2 :(得分:1)

df <- data.frame(col1=c('abc','abc','abc2'),
             col2=c('abc2','abc3',''),
             col3=c('','abc2','') )

lev <- unique(unlist(df))

lev <- lev[ lev != '']

output <- t(apply(df, 1, function(x)    lev %in% x))
dimnames(output) <- list(id = rownames(df), lev)

这应该给出你期望的结果:

output

id    abc abc2  abc3
  1  TRUE TRUE FALSE
  2  TRUE TRUE  TRUE
  3 FALSE TRUE FALSE