2017-05-19 2 views
0

J'ai le sentiment est un problème assez stupide, mais je ne l'ai pas été en mesure de trouver la solution soitSubset Tibble basée sur des montants colonnes, tout en conservant les colonnes de caractères

J'ai un Tibble où chaque ligne est un échantillon et la première colonne est une variable de caractère contenant l'ID de l'échantillon et toutes les colonnes suivantes sont des variables avec des variables numériques.

Par exemple:

id <- c("a", "b", "c", "d", "e") 
x1 <- rep(1,5) 
x2 <- seq(1,5,1) 
x3 <- rep(2,5)  
x4 <- seq(0.1, 0.5, 0.1) 
tb <- tibble(id, x1, x2, x3, x4) 

Je veux sous-ensemble ce pour inclure uniquement les colonnes avec une somme supérieure à 5, et la colonne id. Avec l'ancienne structure de dataframe, je sais ce qui suit travaillé:

df <- as.data.frame(tb) 
df2 <- cbind(df$id, df[,colSums(df[,2:5])>5) 
colnames(df2)[1] <- "id" 

Cependant, lorsque je tente de sous-ensemble de cette façon avec un Tibble, je reçois le message d'erreur:

Error: Length of logical index vector must be 1 or 5, got: 4 

Est-ce que quelqu'un sait comment accomplir cette tâche sans passer à l'ancien format de trame de données? De préférence sans créer un fichier intermédiaire avec la variable id manquante, car séparer mes identifiants de mes données ne fait que poser des problèmes sur la route.

Merci!

+0

'df [C (TRUE, colSums (df [2: 5])> 5)]' – HubertL

Répondre

0
# install.packages(c("tidyverse"), dependencies = TRUE) 
library(tibble) 
df <- tibble(id = letters[1:5], x1 = 1, x2 = 1:5, x3 = 2, x4 = seq(.1, .5, len = 5)) 
### two additional examples of how to generate the Tibble data 
### exploiting that its arguments are evaluated lazily and sequentially 
# df <- tibble(id = letters[1:5], x1 = 1, x2 = 1:5, x3 = x1 + 1, x4 = x2/10) 
# df <- tibble(x2 = 1:5, id = letters[x2], x3 = 2, x1 = x3-1, x4 = x2/10) %>% 
#    select(id, num_range("x", 1:4)) 

base R solution, cf. HubertL's comment above,

### HubertL's base solution 
df[c(TRUE,colSums(df[2:5])>5)] 
#> # A tibble: 5 x 3 
#>  id x2 x3 
#> <chr> <int> <dbl> 
#> 1  a  1  2 
#> 2  b  2  2 
#> 3  c  3  2 
#> 4  d  4  2 
#> 5  e  5  2 

solution dplyr, cf David Klotz's comment,

### Klotz's dplyr solution 
library(dplyr) 
df %>% select_if(function(x) is.character(x) || sum(x) > 5) 
#> # A tibble: 5 x 3 
#>  id x2 x3 
#> <chr> <int> <dbl> 
#> 1  a  1  2 
#> 2  b  2  2 
#> 3  c  3  2 
#> 4  d  4  2 
#> 5  e  5  2 
+1

comme ceci: df %>% select_if (function (x) est.caracter (x) || sum (x)> 5) –