r - R为函数定义列
问题描述
我想要做的是在一列中获取因子级别,然后从这些级别创建额外的列,之后,我很难编写一个函数,将 1 或 0 返回到与一个级别同名的列第一列中的一个因子。如果因子(与列同名)存在于第一列的行中,则目标是在最后有很多列的因子为 1 或 0。
levels <- levels(zivnosti$X41)
zivnosti[ ,dput(as.character(levels))] <- NA
IF2 <- function(x){
if (x %in% dput(as.character(levels(zivnosti$X41))) & x == zivnosti[[col_name]] ){
return(1)
}
else {
return(0)
}
}
zivnosti[ ,dput(as.character(levels))] <- sapply(zivnosti$X41,IF2)
我想对第三列做同样的事情,就像我对第二列做的一样
解决方案
我不知道我是否理解正确,但也许你可以pivot_wider()
从tidyr
包中使用:
library(dplyr)
library(tidyr)
# example dataset
zivnosti <- read.table(header = TRUE, text = "
X1 X2 X3
1 VZP obchod
2 VZP ubytovani
3 VZP pristroje
")
# create wide dataset
zivnosti %>%
mutate(dummy = 1) %>%
pivot_wider(id_cols = c("X1", "X2"), names_from = X3, values_from = dummy, values_fill = 0)
#> # A tibble: 3 x 5
#> X1 X2 obchod ubytovani pristroje
#> <int> <chr> <dbl> <dbl> <dbl>
#> 1 1 VZP 1 0 0
#> 2 2 VZP 0 1 0
#> 3 3 VZP 0 0 1
由reprex 包于 2020-07-06 创建(v0.3.0)
注意:
- 你需要创建一些虚拟变量(
mutate(dummy = 1)
)来获得“正值”(然后你会看到values_from = dummy
), - 您需要定义保持不变的列 (
id_cols = c("X1", "X2")
), - 您需要创建一些虚拟变量来获得“正值”(然后您会看到
values_from = dummy
),对于零,您定义一个备用值(values_fill = 0
)。
功能?
0
如果您想要一个简单的函数,在使用or创建新列时保留原始列1
,我已经尝试过这个(虽然不是很干净,可能不是很有效的base R
解决方案):
# dummy data frame
zivnosti <- data.frame(
X1 = sample(2983:2992),
X40 = "Vseobecna_pece",
X41 = sample(c("obchod", "ubytovani", "pristroje"), 10, replace = TRUE)
)
print(zivnosti)
#> X1 X40 X41
#> 1 2983 Vseobecna_pece ubytovani
#> 2 2990 Vseobecna_pece pristroje
#> 3 2992 Vseobecna_pece pristroje
#> 4 2985 Vseobecna_pece pristroje
#> 5 2991 Vseobecna_pece pristroje
#> 6 2988 Vseobecna_pece ubytovani
#> 7 2989 Vseobecna_pece obchod
#> 8 2986 Vseobecna_pece ubytovani
#> 9 2987 Vseobecna_pece obchod
#> 10 2984 Vseobecna_pece obchod
# this is some kind of transforming function...
change <- function(df, column) {
# 1 for correct column
for (i in 1:nrow(df)) {
df[i, df[i, column]] <- 1
}
# replace NAs with 0
df[is.na(df)] <- 0
# return the changed data frame
return(df)
}
# try that on our dummy data frame
change(zivnosti, "X41")
#> X1 X40 X41 ubytovani pristroje obchod
#> 1 2983 Vseobecna_pece ubytovani 1 0 0
#> 2 2990 Vseobecna_pece pristroje 0 1 0
#> 3 2992 Vseobecna_pece pristroje 0 1 0
#> 4 2985 Vseobecna_pece pristroje 0 1 0
#> 5 2991 Vseobecna_pece pristroje 0 1 0
#> 6 2988 Vseobecna_pece ubytovani 1 0 0
#> 7 2989 Vseobecna_pece obchod 0 0 1
#> 8 2986 Vseobecna_pece ubytovani 1 0 0
#> 9 2987 Vseobecna_pece obchod 0 0 1
#> 10 2984 Vseobecna_pece obchod 0 0 1
(请注意,它适用于没有任何其他NA
s 的小型数据集,但是,如果您认为这是正确的方法,我会尝试找到更好的方法。)
希望这可以帮助!
推荐阅读
- regex - C++11 正则表达式搜索 - 排除空子匹配
- wpf - 取消注册名称(如果存在)
- keras - Keras:IoU 后端实现,其中输入是框角?
- sublimetext3 - 如何更改 sublime 文本搜索栏中的字体 / CTRL + P 键
- jenkins - 如何保存 Jenkins 配置?
- php - 如何为 PHP 修复“尝试获取非对象的属性”?
- x86 - CPUID 会序列化推测性数据缓存吗?
- ffmpeg - 错误:MP4 支持中的 opus 是实验性的,如果您想使用它,请添加“-strict -2”
- java - 如何遍历 Camel 体内的嵌套列表?
- linux - 删除文件中的模式