如何将变量名称作为值标签写入 R 中的另一个变量?
How can I write the names of variables as value labels into another variable in R?
我是 R 的新手。这是我的测试数据框。
test_df<-data.frame(QID=c(1,2,3,4,5,6,7),
ABC_ABC=c(1,0,1,1,0,1,0),
DEF_DEF=c(0,1,0,0,0,0,0),
GHJ_GHJ=c(0,0,0,0,1,0,0),
None=c(0,0,0,0,0,0,1),
model=c(1,2,1,1,3,1,4))
我想做的是将值标签添加到 test_df$model。应将值标签添加为列的名称。所以最终结果应该是 test_df$model:
- n=1,值 1 标记为“ABC_ABC”
- n=2,值 2 标记为“DEF_DEF”
- n=3,值 1 标记为“ABC_ABC”
- n=4,值 1 标记为“ABC_ABC”
- n=5,值 3 标记为“GHJ_GHJ”
- n=6,值 1 标记为“ABC_ABC”
- n=7,值 4 标记为“None”
我的真实数据集要大得多,变量的名称和位置经常变化,因此我需要以“自动化”的方式进行,它将列名作为值标签。
我尝试使用 for 循环,但我无法让它工作(我也读了很多次,在 R 中其他函数如 sapply
、lapply
等应该是使用而不是循环,但我想不出办法)。
如果需要任何其他代码来完全理解我的问题,请告诉我。
提前致谢!
您可以只通过 names() 使用列名,然后使用模型列中的索引(+1,因为 QID 应该被忽略)来创建新列或覆盖模型列:
test_df$model <- names(test_df)[test_df$model+1]
test_df$model
[1] "ABC_ABC" "DEF_DEF" "ABC_ABC" "ABC_ABC" "GHJ_GHJ" "ABC_ABC" "None"
新列的创建将是:
test_df$newColumn <- names(test_df)[test_df$model+1]
df<-data.frame(QID=c(1,2,3,4,5,6,7),
ABC_ABC=c(1,0,1,1,0,1,0),
DEF_DEF=c(0,1,0,0,0,0,0),
GHJ_GHJ=c(0,0,0,0,1,0,0),
None=c(0,0,0,0,0,0,1),
model=c(1,2,1,1,3,1,4))
nm <- names(df)[-c(1, 6)]
index <- apply(df[, -c(1, 6)], 1, which.max)
df$model_name <- nm[index]
df
#> QID ABC_ABC DEF_DEF GHJ_GHJ None model model_name
#> 1 1 1 0 0 0 1 ABC_ABC
#> 2 2 0 1 0 0 2 DEF_DEF
#> 3 3 1 0 0 0 1 ABC_ABC
#> 4 4 1 0 0 0 1 ABC_ABC
#> 5 5 0 0 1 0 3 GHJ_GHJ
#> 6 6 1 0 0 0 1 ABC_ABC
#> 7 7 0 0 0 1 4 None
由 reprex package (v2.0.1)
创建于 2022-01-17
我是 R 的新手。这是我的测试数据框。
test_df<-data.frame(QID=c(1,2,3,4,5,6,7),
ABC_ABC=c(1,0,1,1,0,1,0),
DEF_DEF=c(0,1,0,0,0,0,0),
GHJ_GHJ=c(0,0,0,0,1,0,0),
None=c(0,0,0,0,0,0,1),
model=c(1,2,1,1,3,1,4))
我想做的是将值标签添加到 test_df$model。应将值标签添加为列的名称。所以最终结果应该是 test_df$model:
- n=1,值 1 标记为“ABC_ABC”
- n=2,值 2 标记为“DEF_DEF”
- n=3,值 1 标记为“ABC_ABC”
- n=4,值 1 标记为“ABC_ABC”
- n=5,值 3 标记为“GHJ_GHJ”
- n=6,值 1 标记为“ABC_ABC”
- n=7,值 4 标记为“None”
我的真实数据集要大得多,变量的名称和位置经常变化,因此我需要以“自动化”的方式进行,它将列名作为值标签。
我尝试使用 for 循环,但我无法让它工作(我也读了很多次,在 R 中其他函数如 sapply
、lapply
等应该是使用而不是循环,但我想不出办法)。
如果需要任何其他代码来完全理解我的问题,请告诉我。
提前致谢!
您可以只通过 names() 使用列名,然后使用模型列中的索引(+1,因为 QID 应该被忽略)来创建新列或覆盖模型列:
test_df$model <- names(test_df)[test_df$model+1]
test_df$model
[1] "ABC_ABC" "DEF_DEF" "ABC_ABC" "ABC_ABC" "GHJ_GHJ" "ABC_ABC" "None"
新列的创建将是:
test_df$newColumn <- names(test_df)[test_df$model+1]
df<-data.frame(QID=c(1,2,3,4,5,6,7),
ABC_ABC=c(1,0,1,1,0,1,0),
DEF_DEF=c(0,1,0,0,0,0,0),
GHJ_GHJ=c(0,0,0,0,1,0,0),
None=c(0,0,0,0,0,0,1),
model=c(1,2,1,1,3,1,4))
nm <- names(df)[-c(1, 6)]
index <- apply(df[, -c(1, 6)], 1, which.max)
df$model_name <- nm[index]
df
#> QID ABC_ABC DEF_DEF GHJ_GHJ None model model_name
#> 1 1 1 0 0 0 1 ABC_ABC
#> 2 2 0 1 0 0 2 DEF_DEF
#> 3 3 1 0 0 0 1 ABC_ABC
#> 4 4 1 0 0 0 1 ABC_ABC
#> 5 5 0 0 1 0 3 GHJ_GHJ
#> 6 6 1 0 0 0 1 ABC_ABC
#> 7 7 0 0 0 1 4 None
由 reprex package (v2.0.1)
创建于 2022-01-17