R 使用lappy标记特定变量的值

R 使用lappy标记特定变量的值,r,lapply,R,Lapply,我想使用lappy来标记特定变量的值。我找到了一个让我接近的例子,但我不能让它只适用于数据集中的某些变量 工作示例: df1 <- tribble( ~var1, ~var2, ~var3, ~var4, "1", "1", "1", "a", "2", "2", "2", "b", "3", "3", "3", "c" ) 下面的代码似乎应该可以工作,但却不能: df1["var1", "var2"] <- lapply(df1["var1", "

我想使用lappy来标记特定变量的值。我找到了一个让我接近的例子,但我不能让它只适用于数据集中的某些变量

工作示例:

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
我尝试了很多不同的方法来更改代码,使其正常工作,但我就是想不出来。

你很接近。我们需要df1[cvar1,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
你很接近。我们需要df1[cvar1,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

出现问题的原因是您试图错误地对data.frame子集

在data.frame或tbl中,使用[进行提取有两种方式

由于数据是类似矩阵的矩形形式,因此可以使用[row,column]方法获取特定值。例如,要获取单个值,可以执行类似于df1[2,1]的操作。 由于tbl/data.frame是一种特殊类型的列表,因此如果不提供逗号,它将假定您需要整个列表元素。 因此,当您执行[var1,var2]时,它进入矩阵子集模式并查找名为var1的行,但找不到该行,因此它在数据集中插入了一行NA值

这里有一小组示例供您进行实验

获取行1:4和列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
检查data.frame是否为列表

将data.frame转换为列表,并尝试使用[row,column]提取

提供要提取的值向量

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.frame是一种带有DIM的特殊类型的列表,因此使用空的[,VAL]是可行的

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
查找不存在的行将返回NAs

记住这些细节,最好的方法是按照以下建议使用:


出现问题的原因是您试图错误地对data.frame子集

在data.frame或tbl中,使用[进行提取有两种方式

由于数据是类似矩阵的矩形形式,因此可以使用[row,column]方法获取特定值。例如,要获取单个值,可以执行类似于df1[2,1]的操作。 由于tbl/data.frame是一种特殊类型的列表,因此如果不提供逗号,它将假定您需要整个列表元素。 因此,当您执行[var1,var2]时,它进入矩阵子集模式并查找名为var1的行,但找不到该行,因此它在数据集中插入了一行NA值

这里有一小组示例供您进行实验

获取行1:4和列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
检查data.frame是否为列表

将data.frame转换为列表,并尝试使用[row,column]提取

提供要提取的值向量

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.frame是一种带有DIM的特殊类型的列表,因此使用空的[,VAL]是可行的

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
查找不存在的行将返回NAs

记住这些细节,最好的方法是按照以下建议使用:


只需使用df1[cvar1,var2]或df1[1:2]只需使用df1[cvar1,var2]或df1[1:2]啊,好吧。这么简单的一件事。我不会再犯那个错误了。谢谢@www!啊,好吧。这么简单的一件事。我不会再犯那个错误了。谢谢@www!非常感谢@A5C1D2H2I1M1N2O1R2T1!这是帮助我更好地理解R和编码背后的逻辑的答案。非常感谢@A5C1D2H2I1M1N2O1R2T1!这是这是一种帮助我更好地理解R和编码背后的逻辑的答案。非常感谢。
df["not here", ]
#    mpg cyl disp hp
# NA  NA  NA   NA NA
df1[c("var1", "var2")]