根据索引列表为列分配值

时间:2019-04-10 21:21:45

标签: r

我正在处理来自Kaggle的Netflix数据及其格式化方式,其中第一行具有电影ID,后跟该电影的客户ID和评分行。 因此格式为:

1:
3245 4
5443 2
2:
4346 4
2345 5

,其中只有1个数字的行是电影ID,接下来的行是该电影的客户评价。 我试图提取这些电影ID,然后在客户评价中创建另一列来保存该电影ID,但是我不确定如何做到这一点。 我设法创建了一个出现电影ID的所有索引的列表:

movie_title_index = which(is.na(df), arr.ind=TRUE)

但是我一直很难弄清楚如何将该索引处的项目分配给该列之后的每一行。到目前为止,这是我能想到的,但是没有用:

df[rownames(df)>movie_title_index,]$movie_id = df$V1[movie_title_index]

1 个答案:

答案 0 :(得分:0)

我重新创建了您的数据,如下所示:

df <- data.frame(
  x = c(
    "1:",
    "3245 4",
    "5443 2",
    "2:",
    "4346 4",
    "2345 5"
  ),
  stringsAsFactors = FALSE
)

这是一个使用tidyverse的解决方案,它可以分解字符串部分并向下填充MoveID。

library(dplyr)
library(tidyr)
library(stringr)

df %>% 
  mutate(MoveID = str_extract(x,"^[[:digit:]](?=\\:)"),
         CustomedID = str_extract(x,"^[[:digit:]]+(?=\\s)"),
         Score = str_extract(x,"(?<=\\s)[[:digit:]]+$")) %>%
  fill(MoveID) %>%
  filter(complete.cases(.)) %>%
  select(-x)

#>
  MoveID CustomedID Score
1      1       3245     4
2      1       5443     2
3      2       4346     4
4      2       2345     5