大佬教程收集整理的这篇文章主要介绍了对执行因子的函数施加条件,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
这个问题与这个 here 相关,在@Akruns 的要求下,我提出了类似的要求。
基本上,如果我在以下条件中插入数据框:
if(length(weight) > 0) {weight %>%
SELEct(where(negate(is.numeriC))) %>%
map_dfc(~ model.matrix(~ .x -1) %>%
as_tibblE) %>%
r@R_674_8371@_all(~ str_remove(.,"\\.x")) %>%
bind_rows(weight,.)
}
作业:
#Following @Akruns mention for turning numeric into factor:
i1 <- sapply(weight,is.numeric); df[i1] <- lapply(weight[i1],factor) and then use the Filter(function(X) is.factor(X)|is.character(X),weight)
test = function(data) {
x = as.data.frame(Reduce(cbind,lapply(x,function(col) model.matrix(~ . -1,data = data.frame(col)))))
setnames(x,sub(pattern = "^col",replacement = "",names(X)))
}
test(weight)
#Missing column names
1 64 57 8 1 0 0 1 0
2 71 59 10 1 0 0 1 0
3 53 49 6 1 0 0 1 0
4 67 62 11 1 0 0 1 0
5 55 51 8 0 0 1 1 0
6 58 50 7 0 0 1 1 0
7 77 55 10 0 0 1 0 1
8 57 48 9 0 0 1 0 1
9 56 42 10 0 1 0 0 1
10 51 42 6 0 1 0 0 1
11 76 61 12 0 1 0 0 1
12 68 57 9 0 1 0 0 1
然后,如果 weight
有因子,它会将作为因子的列拆分为列,并使用 1
之前出现的位置和 0
其他位置为它们分配值。
但是,如果我输入一个只有 numeric
的数据帧,它会返回 character(0)
。问题是,如何为以下函数提供一个条件,例如 x
的数据帧是否为数字,然后按原样返回数据帧。如果是因子,则返回请求的输出。
我要求这样做的原因是因为我希望在另一个函数中实现它,该函数将包含许多数据框,其中一些只有数字,而另一些则包含因子。在这种情况下,我可以在函数中将数据帧表示为 x
。
我对函数的编辑:
fact_col <- function(X){
if(length(X) > 0) {
weight_sub <- x %>%
SELEct(where(is.factor))
weight_sub %>%
map_dfc(~ model.matrix(~ .x -1) %>%
as_tibblE) %>%
r@R_674_8371@_all(~ str_remove(.,"\\.x")) %>%
bind_cols(weight_sub,.) -> x
x<- x%>% SELEct(!where(is.factor))
x<- data.frame(sapply(x,as.numeriC))
}}
预期输出:
#when x is numeric
function(X) { ... }
Richness pat
1 20 1
2 17 2
3 18 3
4 19 4
5 11 5
6 15 6
7 17 7
8 15 8
9 15 9
10 9 10
11 13 11
12 14 12
#when x is a factor
function(X) { ... }
wgt hgt age ID sex black brown white female male
1 64 57 8 black female 1 0 0 1 0
2 71 59 10 black female 1 0 0 1 0
3 53 49 6 black female 1 0 0 1 0
4 67 62 11 black female 1 0 0 1 0
5 55 51 8 white female 0 0 1 1 0
6 58 50 7 white female 0 0 1 1 0
7 77 55 10 white male 0 0 1 0 1
8 57 48 9 white male 0 0 1 0 1
9 56 42 10 brown male 0 1 0 0 1
10 51 42 6 brown male 0 1 0 0 1
11 76 61 12 brown male 0 1 0 0 1
12 68 57 9 brown male 0 1 0 0 1
可重现的代码:
structure(List(wgt = c(64L,71L,53L,67L,55L,58L,77L,57L,56L,51L,76L,68L),hgt = c(57L,59L,49L,62L,50L,48L,42L,61L,57L),age = c(8L,10L,6L,11L,8L,7L,9L,12L,9L),ID = structure(c(1L,1L,3L,2L,2L),.Label = c("black","brown","white"
),class = "factor"),sex = structure(c(1L,.Label = c("female","male"),class = "factor")),class = "data.frame",row.names = c(NA,-12L))
一个选项是在我们使用 if
之前拆分代码,即 SELEct
列是 factor
并创建一个新对象('weight_sub'),然后检查 {{ 1}} 在 'weight_sub' 上,length
它大于 0,执行 if
的其余部分并将其分配回 'weight'
@H_183_7@model.matrix
-输出
weight_sub <- weight %>%
SELEct(where(is.factor))
if(length(weight_sub) > 0) {
weight_sub %>%
map_dfc(~ model.matrix(~ .x -1) %>%
as_tibblE) %>%
r@R_674_8371@_all(~ str_remove(.,"\\.x")) %>%
bind_cols(weight,.) -> weight
}
作为否定测试,通过检查它是否为 # wgt hgt age id sex black brown white female male
#1 64 57 8 black female 1 0 0 1 0
#2 71 59 10 black female 1 0 0 1 0
#3 53 49 6 black female 1 0 0 1 0
#4 67 62 11 black female 1 0 0 1 0
#5 55 51 8 white female 0 0 1 1 0
#6 58 50 7 white female 0 0 1 1 0
#7 77 55 10 white male 0 0 1 0 1
#8 57 48 9 white male 0 0 1 0 1
#9 56 42 10 brown male 0 1 0 0 1
#10 51 42 6 brown male 0 1 0 0 1
#11 76 61 12 brown male 0 1 0 0 1
#12 68 57 9 brown male 0 1 0 0 1
类列来执行此操作
character
没有输出,因为 weight_sub <- weight %>%
SELEct(where(is.character))
if(length(weight_sub) > 0) {
weight_sub %>%
map_dfc(~ model.matrix(~ .x -1) %>%
as_tibblE) %>%
r@R_674_8371@_all(~ str_remove(.,.) -> weight
}
条件返回 if
,因此“权重”数据集保持不变,没有添加任何新列
在更新中,如果 OP 还使用 falSE
列传递给 numeric
,它只会返回相同的列,即一列(因为我们使用 {{1} }) 列名称为 @H_183_7@model.matrix (来自 @H_183_7@map 公式)。当我们使用 .x
时,这个 @H_183_7@model.matrix 列名被 .x
删除,留下一个空白的列名,默认情况下,该列名填充为从 {{1} 指定为“col”的列名}.为了防止这种情况,我们可以在执行此操作之前使用 r@R_674_8371@_all
条件将原始列名附加为具有一列输出且为数字的后缀
str_remove
-输出
_dfc
或者我们使用 if/else
中的 weight %>%
imap_dfc(~ {
nm1 <- .y
tmp <- model.matrix(~ .x - 1) %>%
as_tibble
if(ncol(tmp) == 1 && class(tmp[[1]]) == 'numeric') {
names(tmp) <- paste0(names(tmp),nm1)
}
tmp
}) %>%
r@R_674_8371@_all(~ str_remove(.,"\\.x"))
# A tibble: 12 x 8
# wgt hgt age black brown white female male
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 64 57 8 1 0 0 1 0
# 2 71 59 10 1 0 0 1 0
# 3 53 49 6 1 0 0 1 0
# 4 67 62 11 1 0 0 1 0
# 5 55 51 8 0 0 1 1 0
# 6 58 50 7 0 0 1 1 0
# 7 77 55 10 0 0 1 0 1
# 8 57 48 9 0 0 1 0 1
# 9 56 42 10 0 1 0 0 1
#10 51 42 6 0 1 0 0 1
#11 76 61 12 0 1 0 0 1
#12 68 57 9 0 1 0 0 1
以上是大佬教程为你收集整理的对执行因子的函数施加条件全部内容,希望文章能够帮你解决对执行因子的函数施加条件所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。