我正在努力将下面的代码行转换为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
向量中提取的所有唯一类型。 - 接下来,我们寻找
genres
和genre
列之间的匹配,将其转换为二进制值。 - 最后我们使用
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)
返回相同的输出。