r语言 - 根据其他列中的值添加新列



我正在努力将下面的代码行转换为r.

for genre in c_a:
df['is_'+str(genre)] = df['genre'].apply(lambda x: genre in [y.strip() for y in x.split(',')])

基本上,我有一个对象(类型"character",其中有1341个值),我想为变量的每个值添加新列,并通过检查新列是否包含在类型列中为新列赋0/1值。

例如:

当前输入:

style
dance pop, pop
国家,流行

Python:

import pandas as pd
df = pd.DataFrame({"Genre": ["Dance pop, pop", "country, pop"]})
for col in set(sum([i.split(',') for i in df['Genre']],[])):          ##['Dance pop', ' pop', 'country', ' pop']
df[col] = df['Genre'].apply(lambda x: 1 if col in x.split(',') else 0)
df

您可以使用tidyverse方法,但我怀疑它是否会加快速度。假设您的数据存储在一个向量genre中:

library(tidyverse)
genre <- c("dance pop, pop", "country, pop")
genre %>% 
data.frame(genre = .) %>% 
expand_grid(genres = unique(trimws(unlist(strsplit(genre, ","))))) %>% 
mutate(value = +str_detect(genre, genres)) %>% 
pivot_wider(names_from = genres)

这返回

# A tibble: 2 x 4
genre          `dance pop`   pop country
<chr>                <int> <int>   <int>
1 dance pop, pop           1     1       0
2 country, pop             0     1       1

  • 首先,我们用一个新的genres列创建一个data.frame,其中包含从genre向量中提取的所有唯一类型。
  • 接下来,我们寻找genresgenre列之间的匹配,将其转换为二进制值。
  • 最后我们使用pivot_wider把它变成一个矩形。

如果您的数据存储在data.frame中,则使用类似的方法:

data.frame(genre = c("dance pop, pop", "country, pop")) %>% 
expand_grid(genres = unique(trimws(unlist(strsplit(.$genre, ","))))) %>% 
mutate(value = +str_detect(genre, genres)) %>% 
pivot_wider(names_from = genres)

返回相同的输出。

相关内容

  • 没有找到相关文章

最新更新