作为R中data.table包的相对缺乏经验的用户,我一直在尝试将一个文本列处理成大量的指示符列(虚拟变量),每列中有一个1表示特定的子字符串是在字符串列中找到.例如,我想处理这个:
ID String
1 a$b
2 b$c
3 c
Run Code Online (Sandbox Code Playgroud)
进入这个:
ID String a b c
1 a$b 1 1 0
2 b$c 0 1 1
3 c 0 0 1
Run Code Online (Sandbox Code Playgroud)
我已经弄清楚如何进行处理,但运行时间比我想要的要长,我怀疑我的代码效率低下.我的代码的可重现版本与虚拟数据如下.请注意,在实际数据中,要搜索的子字符串超过2000个,每个子字符串的长度大约为30个字符,最多可能有几百万行.如果需要,我可以并行化并为问题投入大量资源,但我希望尽可能优化代码.我试过运行Rprof,这表明没有明显(对我而言)改进.
set.seed(10)
elements_list <- c(outer(letters, letters, FUN = paste, sep = ""))
random_string <- function(min_length, max_length, separator) {
selection <- paste(sample(elements_list, ceiling(runif(1, min_length, max_length))), collapse = separator)
return(selection)
}
dt <- data.table(id = c(1:1000), messy_string = "")
dt[ , messy_string := random_string(2, 5, "$"), by = id]
create_indicators <- function(search_list, …Run Code Online (Sandbox Code Playgroud) 我有一个带有分类变量的数据框,其中包含可变长度的字符串列表(这很重要,因为否则此问题将与此或此重复),例如:
df <- data.frame(x = 1:5)
df$y <- list("A", c("A", "B"), "C", c("B", "D", "C"), "E")
df
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)x y 1 1 A 2 2 A, B 3 3 C 4 4 B, D, C 5 5 E
并且所需的形式是在任何地方看到的每个唯一字符串的虚拟变量df$y,即:
data.frame(x = 1:5, A = c(1,1,0,0,0), B = c(0,1,0,1,0), C = c(0,0,1,1,0), D = c(0,0,0,1,0), E = c(0,0,0,0,1))
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)x A B C D E 1 1 1 0 0 0 0 2 2 1 …
如果我们不确定分类特征的性质,例如它们是名义特征还是序数特征,我们应该使用哪种编码?序数编码还是单热编码?关于这个主题有明确的规则吗?
我看到很多人在没有方向的分类数据上使用序数编码。假设有一个频数表:
some_data[some_col].value_counts()
[OUTPUT]
color_white 11413
color_green 4544
color_black 1419
color_orang 3
Name: shirt_colors, dtype: int64
Run Code Online (Sandbox Code Playgroud)
有很多人更喜欢在本专栏上进行序数编码。我一心一意地选择 One-Hot-Encoding。我对此的看法是进行序数编码将为这些颜色分配一些有序数字,我暗示了一个排名。而且一开始就没有排名。换句话说,我的模型不应将 color_white 视为 4,将 color_orang 视为 0、1 或 2。请记住,数据描述中也没有任何排名或顺序的提示。
我对这个话题有如下的理解:
既没有方向也没有大小的数字是名义变量。例如,fruit_list =['苹果', '橙子', 香蕉']。除非有特定的上下文,否则该集合将被称为名义集合。对于此类变量,我们应该执行 get_dummies 或 one-hot-encoding
而序数变量有一个方向。例如,shirt_sizes_list = [大、中、小]。这些变量称为序数变量。如果同一个水果列表背后有上下文,例如价格或营养价值,即可以为 Fruit_list 中的水果提供某种排名或顺序,我们将其称为序数变量。对于序数变量,我们执行序数编码
我的理解正确吗?请提供您的反馈 这个主题已经变成了一场噩梦 谢谢!
machine-learning ordinal categorical-data dummy-variable one-hot-encoding
在我的数据框中,我有一个分类变量,我想将其转换为虚拟变量.但是,此列有多个以逗号分隔的值:
0 'a'
1 'a,b,c'
2 'a,b,d'
3 'd'
4 'c,d'
Run Code Online (Sandbox Code Playgroud)
最后,我想为每个可能的离散值设置二进制列; 换句话说,最终列数等于原始列中唯一值的数量.我想我必须使用split()来获取每个单独的值但不确定之后要做什么.任何提示非常感谢!
编辑:附加扭曲.列具有空值.并且在回应评论时,以下是期望的输出.谢谢!
a b c d
0 1 0 0 0
1 1 1 1 0
2 1 1 0 1
3 0 0 0 1
4 0 0 1 1
Run Code Online (Sandbox Code Playgroud) 假设我有一个小玩意儿。
library(tidyverse)
tib <- as.tibble(list(record = c(1:10),
gender = as.factor(sample(c("M", "F"), 10, replace = TRUE)),
like_product = as.factor(sample(1:5, 10, replace = TRUE)))
tib
# A tibble: 10 x 3
record gender like_product
<int> <fctr> <fctr>
1 1 F 2
2 2 M 1
3 3 M 2
4 4 F 3
5 5 F 4
6 6 M 2
7 7 F 4
8 8 M 4
9 9 F 4
10 10 M 5
Run Code Online (Sandbox Code Playgroud)
我想用 1 和 0 对我的数据进行虚拟编码,以便数据看起来更多/更少像这样。 …
我正在使用 dummies 包为分类变量生成虚拟变量,其中一些具有两个以上的类别。
testdf<- data.frame(
"A" = as.factor(c(1,2,2,3,3,1)),
"B" = c('A','B','A','B','C','C'),
"C"= c('D','D','E','D','D','E'))
#
#Generate dummy variables:
#
testdf<- cbind(testdf, dummy(testdf$C, sep='_'))
testdf<- cbind(testdf, dummy(testdf$B, sep='_'))
Run Code Online (Sandbox Code Playgroud)
对于这两个命令,我得到:
Run Code Online (Sandbox Code Playgroud)Warning message: In model.matrix.default(~x - 1, model.frame(~x - 1), contrasts = FALSE) : non-list contrasts argument ignored
结果似乎是正确的。您能否就警告的原因提出建议?
我有一个每日时间序列数据集,我使用 Python SARIMAX 方法来预测未来。但我不知道如何在 python 中编写考虑多个季节性的代码。据我所知,SARIMAX 只处理一个季节性,但我想检查每周、每月和每季度的季节性。我知道要捕捉星期几的季节性,我应该创建 6 个虚拟变量,要捕捉月份的季节性,创建 30 个虚拟变量,并且要捕捉一年中的月份,创建 11 个虚拟变量。但我不知道如何将它与 Python 中的主要 SARIMAX 函数合并?我的意思是 SARIMAX 只是一个执行自回归、移动平均和差分部分的函数,但是我应该如何在使用 SARIMAX 的时间序列分析中包含多个季节性代码?迄今为止,我知道如何为每个类别创建虚拟变量,但不知道如何将其复制到整个数据集?之后我不知道如何编写 Python 代码来执行 SARIMAX 并同时捕获多个季节性。
我需要可以执行此操作的 Python 代码的帮助。
请相应地建议
问候
test = {'ngrp' : ['Manhattan', 'Brooklyn', 'Queens', 'Staten Island', 'Bronx']}
test = pd.DataFrame(test)
dummy = pd.get_dummies(test['ngrp'], drop_first = True)
Run Code Online (Sandbox Code Playgroud)
这给了我:
Brooklyn Manhattan Queens Staten Island
0 0 1 0 0
1 1 0 0 0
2 0 0 1 0
3 0 0 0 1
4 0 0 0 0
Run Code Online (Sandbox Code Playgroud)
我将获得Bronx作为我的参考水平(因为这是删除的东西),如何更改它以指定应该将曼哈顿作为我的参考水平?我的预期输出是
Brooklyn Queens Staten Island Bronx
0 0 0 0 0
1 1 0 0 0
2 0 1 0 0
3 0 0 1 0
4 0 0 0 …Run Code Online (Sandbox Code Playgroud) 假设我有一个数据框:性别可以将 F 作为女性或 M 作为男性种族可以将 A 作为亚洲人,W 作为白人,B 作为黑人,H 作为西班牙裔
| id | Gender | Race |
| --- | ----- | ---- |
| 1 | F | W |
| 2 | F | B |
| 3 | M | A |
| 4 | F | B |
| 5 | M | W |
| 6 | M | B |
| 7 | F | H |
Run Code Online (Sandbox Code Playgroud)
我想有一组基于性别和种族的列作为虚拟对象,数据框应该像
| id | Gender | Race …Run Code Online (Sandbox Code Playgroud) 如果包含缺失值,如何创建虚拟变量?我有以下数据,我想根据几个条件创建一个虚拟变量。我的问题是它会自动将我的缺失值转换为 0,但我想将它们保留为缺失值。
import pandas as pd
mydata = {'x' : [10, 50, np.nan, 32, 47, np.nan, 20, 5, 100, 62],
'y' : [10, 1, 5, np.nan, 47, np.nan, 8, 5, 100, 3]}
df = pd.DataFrame(mydata)
df["z"] = ((df["x"] >= 50) & (df["y"] <= 20)).astype(int)
print(df)
Run Code Online (Sandbox Code Playgroud) dummy-variable ×10
r ×5
python ×4
pandas ×2
split ×2
tidyverse ×2
arima ×1
contrast ×1
data-science ×1
data.table ×1
dataframe ×1
list ×1
missing-data ×1
model.matrix ×1
nan ×1
ordinal ×1
purrr ×1
string ×1
time-series ×1