purrr - извлечь строки данных в виде векторов - PullRequest
0 голосов
/ 07 июня 2018

У меня есть датафрейм, и я хочу извлечь каждую строку в список, приведенный как вектор.Для этого я хочу использовать только пакеты tidyverse и purrr.

У меня есть следующее reprex, где я пытался это сделать:

library(magrittr)
library(tidyverse)
# Create the raw dummy data frame
df <- data.frame(
    x = c("apple", "banana", "cherry"),
    pattern = c("p", "n", "h"),
    replacement = c("x", "f", "q"),
    stringsAsFactors = FALSE
)

# Define the function to extract the specific row index
# of the dataframe as a vector
get_row_vec <- function(df, row_idx){
    df %>% 
        dplyr::slice(row_idx) %>% 
        base::unlist() %>% 
        base::as.vector()
}

# Try and apply get_row_vec rowwise on the dataframe
# NOTE: This does not work! Need help to fix this
purrr::pmap(.l = df, ~get_row_vec(df  = .l, row_idx = 1))
#> Error in eval(lhs, parent, parent): object '.l' not found

Может ли кто-нибудь помочь исправить вышеприведенный код и помочь мне понять, как это сделать с purrr?

РЕДАКТИРОВАТЬ: Согласно комментариям ниже, это идеальный вывод, который я ищучерез purrr

# MANUAL version of desired output
output <- list(get_row_vec(df, 1),
               get_row_vec(df, 2),
               get_row_vec(df, 3))
output
#> [[1]]
#> [1] "apple" "p"     "x"    
#> 
#> [[2]]
#> [1] "banana" "n"      "f"     
#> 
#> [[3]]
#> [1] "cherry" "h"      "q"

Спасибо

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

Как насчет этого?

map(t(df) %>% as.data.frame(), ~unname(unlist(.x)))
#$V1
#[1] apple p     x
#Levels: apple p x
#
#$V2
#[1] banana n      f
#Levels: banana f n
#
#$V3
#[1] cherry h      q
#Levels: cherry h q

Чтобы избежать factor s

map(t(df) %>% as.data.frame(), ~unname(as.character(unlist(.x))))
#$V1
#[1] "apple" "p"     "x"
#
#$V2
#[1] "banana" "n"      "f"
#
#$V3
#[1] "cherry" "h"      "q"
0 голосов
/ 07 июня 2018

быстрая база R:

as.list(data.frame(t(df),stringsAsFactors = F))
$X1
[1] "apple" "p"     "x"    

$X2
[1] "banana" "n"      "f"     

$X3
[1] "cherry" "h"      "q"   

или вы можете сделать:

 split(unname(unlist(df)),c(row(df)))#split(unlist(df,use.names = F),c(row(df)))
$`1`
[1] "apple" "p"     "x"    

$`2`
[1] "banana" "n"      "f"     

$`3`
[1] "cherry" "h"      "q"     
0 голосов
/ 07 июня 2018

Вы можете использовать purrr::transpose для этой цели:

library(purrr)
map(transpose(df), unlist, use.names = F)

#[[1]]
#[1] "apple" "p"     "x"    

#[[2]]
#[1] "banana" "n"      "f"     

#[[3]]
#[1] "cherry" "h"      "q"  

Или, если используете pmap:

pmap(df, c, use.names = F)

#[[1]]
#[1] "apple" "p"     "x"    

#[[2]]
#[1] "banana" "n"      "f"     

#[[3]]
#[1] "cherry" "h"      "q"   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...