程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了对执行因子的函数施加条件大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决对执行因子的函数施加条件?

开发过程中遇到对执行因子的函数施加条件的问题如何解决?下面主要结合日常开发的经验,给出你关于对执行因子的函数施加条件的解决方法建议,希望对你解决对执行因子的函数施加条件有所启发或帮助;

这个问题与这个 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,请注明来意。
标签: