首页 > 解决方案 > 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) 

我想对第三列做同样的事情,就像我对第二列做的一样

在此处输入图像描述

标签: rfunction

解决方案


我不知道我是否理解正确,但也许你可以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

(请注意,它适用于没有任何其他NAs 的小型数据集,但是,如果您认为这是正确的方法,我会尝试找到更好的方法。)

希望这可以帮助!


推荐阅读