Итерируйте по списку dfs, применяя fn к тому же col в каждом df - PullRequest
0 голосов
/ 01 ноября 2019

имеют большой df, который я разделил на список dfs по уровню определенного col. Я пытаюсь перебрать указанный список dfs, получая доступ к одному и тому же col в каждом df, применяя get_nrc_sentiment () fn ко всем строкам текстовых данных в вышеупомянутом col в каждом df.

library(syuzhet)

# create example df
df <- data.frame("a"=c(1:3, 1, 1), 
"b"=c("bad", "angry", "joy", "happy", "unhappy"))
df

df_split <- split(df, df$a)  
df_split # split df by a into list of dfs    

# iterate over col data in each df within 
# list of dfs and apply sentiment function
for(i in 1:length(df_split)){
df2 <- lapply(as.vector(df_split[[i]]$b), function(x) get_nrc_sentiment(x))
}   
# for some reason only works for last df within list of dfs
df2  

# desired output, but for each df col within list
df3 <- get_nrc_sentiment(as.vector(df_split[[1]]$b))
df3

# output of df
  a       b
1 1     bad
2 2   angry
3 3     joy
4 1   happy
5 1 unhappy

# output of df_split
$`1`
  a       b
1 1     bad
4 1   happy
5 1 unhappy

$`2`
  a     b
2 2 angry

$`3`
  a   b
3 3 joy

# output of code within for loop
[[1]]
  anger anticipation disgust fear joy sadness surprise trust negative positive
1     0            0       0    0   1       0        0     0        0        1

# output of df3, desired output example for each df within list
  anger anticipation disgust fear joy sadness surprise trust negative positive
1     1            0       1    1   0       1        0     0        1        0
2     0            1       0    0   1       0        0     1        0        1
3     1            0       1    0   0

Как вы можете надеяться, вы видите, что это работает только на последнем df в списке dfs, а не на всех df в списке dfs. Возможно, я ошибаюсь в цикле for, я также пытался использовать lapply внутри lapply, но у меня нет других идей о том, как получить доступ к col в каждом df из списка dfs. Очень признателен за помощь и надеюсь, что приведенные мной примеры достаточно ясны.

Ответы [ 3 ]

0 голосов
/ 01 ноября 2019

Я не совсем понимаю ваш код, но я привел ниже пример того, как применить функцию к каждому df и поместить их все в список. Я надеюсь, что это помогает.

res <- list() # empty list to put into final result


for (i in seq(length(list_a))) {
  l <- as.data.frame(list_a[[i]]) # convert every df in list to normal df
  l = l$b # put your sentiment function here 
  res[[i]]=l  # add every df result to list of df, not just last one 
  print(res)

}
0 голосов
/ 01 ноября 2019

Вам не нужно вызывать lapply внутри цикла, поскольку lapply будет применять одну и ту же функцию к каждому элементу списка. В качестве альтернативы вы можете использовать purrr::map.


library("tidyverse")
library("syuzhet")

# create example df
df <- data.frame(
  "a" = c(1:3, 1, 1),
  "b" = c("bad", "angry", "joy", "happy", "unhappy"),
  # Don't make `b` a factor
  stringsAsFactors = FALSE
)

# split df by a into list of dfs
df_split <- split(df, df$a)

lapply(
  df_split,
  function(x) get_nrc_sentiment(x$b)
)
#> $`1`
#>   anger anticipation disgust fear joy sadness surprise trust negative
#> 1     1            0       1    1   0       1        0     0        1
#> 2     0            1       0    0   1       0        0     1        0
#> 3     1            0       1    0   0       1        0     0        1
#>   positive
#> 1        0
#> 2        1
#> 3        0
#> 
#> $`2`
#>   anger anticipation disgust fear joy sadness surprise trust negative
#> 1     1            0       1    0   0       0        0     0        1
#>   positive
#> 1        0
#> 
#> $`3`
#>   anger anticipation disgust fear joy sadness surprise trust negative
#> 1     0            0       0    0   1       0        0     0        0
#>   positive
#> 1        1

df_split %>%
  map(~ get_nrc_sentiment(.$b))
#> $`1`
#>   anger anticipation disgust fear joy sadness surprise trust negative
#> 1     1            0       1    1   0       1        0     0        1
#> 2     0            1       0    0   1       0        0     1        0
#> 3     1            0       1    0   0       1        0     0        1
#>   positive
#> 1        0
#> 2        1
#> 3        0
#> 
#> $`2`
#>   anger anticipation disgust fear joy sadness surprise trust negative
#> 1     1            0       1    0   0       0        0     0        1
#>   positive
#> 1        0
#> 
#> $`3`
#>   anger anticipation disgust fear joy sadness surprise trust negative
#> 1     0            0       0    0   1       0        0     0        0
#>   positive
#> 1        1

Создано в 2019-11-01 с помощью пакета Представить (v0.3.0)

0 голосов
/ 01 ноября 2019

Этот цикл for не работает

for(i in 1:length(df_split)){
df2 <- lapply(as.vector(df_split[[i]]$b), function(x) get_nrc_sentiment(x))
}  

На каждой итерации вы перезаписываете df2.

Вы можете использовать функцию, когда вы применяете функцию разделения данных.frame

by(df,df$a,function(i)get_nrc_sentiment(as.character(i$b)))

Я не знаком с get_nrc_sentiment, но похоже, что когда он применяется к df_split [[1]] $ b, вы получаете 3 строки?

dplyr решение:

df %>% group_by(a) %>% group_map(~ get_nrc_sentiment(.x$b))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...