使用lapply标记特定变量的值

时间:2017-12-22 02:23:30

标签: r lapply

我想使用lapply来标记特定变量的值。我找到了一个让我靠近的例子(here),但我无法让它仅用于数据集中的某些变量。

工作示例:

df1 <- tribble(
 ~var1, ~var2, ~var3, ~var4,
 "1",   "1",   "1", "a",
 "2",   "2",   "2", "b",
 "3",   "3",   "3", "c"
)

以下代码似乎应该有效,但不是:

df1["var1", "var2"] <- lapply(df1["var1", "var2"], factor,
                          levels=c(1, 
                                   2, 
                                   3), 
                          labels = c("Agree", 
                                     "Neither Agree/Disagree", 
                                     "Disagree"))

代码运行,但提供以下输出:

# A tibble: 4 x 4
  var1  var2  var3  var4
* <chr> <chr> <chr> <chr>
1     1     1     1     a
2     2     2     2     b
3     3     3     3     c
4  <NA>  <NA>  <NA>  <NA>

如果我只尝试一个变量,它可以工作:

df1["var1"] <- lapply(df1["var1"], factor,
                          levels=c(1, 
                                2, 
                                3), 
                          labels = c("Agree", 
                                  "Neither Agree/Disagree", 
                                  "Disagree"))

它提供以下输出(这是正确的):

# A tibble: 3 x 4
                    var1  var2  var3  var4
                  <fctr> <chr> <chr> <chr>
1                  Agree     1     1     a
2 Neither Agree/Disagree     2     2     b
3               Disagree     3     3     c

我尝试了很多不同的方法来更改代码以使其工作,但我无法弄明白。

2 个答案:

答案 0 :(得分:2)

你很亲密。我们需要df1[c("var1", "var2")]来指定列。

df1[c("var1", "var2")] <- lapply(df1[c("var1", "var2")], factor,
                              levels=c("1", 
                                       "2", 
                                       "3"), 
                              labels = c("Agree", 
                                         "Neither Agree/Disagree", 
                                         "Disagree"))
df1
# # A tibble: 3 x 4
#                     var1                   var2  var3  var4
#                   <fctr>                 <fctr> <chr> <chr>
# 1                  Agree                  Agree     1     a
# 2 Neither Agree/Disagree Neither Agree/Disagree     2     b
# 3               Disagree               Disagree     3     c

答案 1 :(得分:2)

您的问题正在发生,因为您正试图错误地对data.frame进行分组。

data.frametbl中,使用[进行提取可以通过多种方式进行。

  • 由于数据采用matrix形式,因此您可以使用[row, column]方法获取特定值。例如,要获得单个值,您可以执行df1[2, 1]
  • 之类的操作
  • 由于tbl / data.frame是特殊类型的list,如果您不提供逗号,则会假定您需要整个列表元素。

因此,当你执行["var1", "var2"]时,它进入了matrix子集模式,并且正在寻找一个名为&#34; var1&#34;的行,它无法找到,所以它在您的数据集中插入了一行NA值。

这里有一小部分示例供您试验。

  • 获取第1行和第1列以及第1列:第4列

    df <- mtcars[1:4, 1:4]
    df
    #                 mpg cyl disp  hp
    # Mazda RX4      21.0   6  160 110
    # Mazda RX4 Wag  21.0   6  160 110
    # Datsun 710     22.8   4  108  93
    # Hornet 4 Drive 21.4   6  258 110
    
  • 使用[row, column]方法

    提取单个值
    df["Mazda RX4", "mpg"]  # [row, column]
    # [1] 21
    
  • 检查data.frame是否为list

    is.list(df)
    # [1] TRUE
    
  • data.frame转换为list并尝试使用[row, column]进行提取。

    L <- unclass(df)
    L["Mazda RX4", "mpg"]   # A list doesn't have `dim`s.
    # Error in L["Mazda RX4", "mpg"] : incorrect number of dimensions
    
  • 只提供一个值,以便从data.framelist

    中提取
    df["mpg"]               # Treats it as asking for a single value from a list
    #                 mpg
    # Mazda RX4      21.0
    # Mazda RX4 Wag  21.0
    # Datsun 710     22.8
    # Hornet 4 Drive 21.4
    
    L["mpg"]
    # $mpg
    # [1] 21.0 21.0 22.8 21.4
    
  • 提供值的向量以提取

    df[c("mpg", "hp")]
    #                 mpg  hp
    # Mazda RX4      21.0 110
    # Mazda RX4 Wag  21.0 110
    # Datsun 710     22.8  93
    # Hornet 4 Drive 21.4 110
    
    L[c("mpg", "hp")]
    # $mpg
    # [1] 21.0 21.0 22.8 21.4
    # 
    # $hp
    # [1] 110 110  93 110
    
  • 由于data.framelist的一种特殊类型dim,因此使用空[, vals]可以使用

    df[, c("mpg", "hp")]
    #                 mpg  hp
    # Mazda RX4      21.0 110
    # Mazda RX4 Wag  21.0 110
    # Datsun 710     22.8  93
    # Hornet 4 Drive 21.4 110
    
  • 查找不存在的行会返回NA s

    df["not here", ]
    #    mpg cyl disp hp
    # NA  NA  NA   NA NA
    

记住这些细节,您最好的方法就是使用(如@www's answer中所述:

df1[c("var1", "var2")]