我想使用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
我尝试了很多不同的方法来更改代码以使其工作,但我无法弄明白。
答案 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.frame
或tbl
中,使用[
进行提取可以通过多种方式进行。
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.frame
或list
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.frame
是list
的一种特殊类型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")]