【问题标题】:Assign a value to a column based on list of indices根据索引列表为列分配值
【发布时间】:2019-04-11 05:43:18
【问题描述】:

我正在处理来自 Kaggle 的 Netflix 数据及其格式,其中有 1 行是电影 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]

【问题讨论】:

  • 您可以使用dput() 发布您的数据吗?

标签: r


【解决方案1】:

我按如下方式重新创建了您的数据:

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

【讨论】:

  • 不客气。如果这解决了您的问题,请accept回答。
猜你喜欢
  • 2018-06-01
  • 2023-02-23
  • 2013-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
  • 2017-01-19
相关资源
最近更新 更多