这是我的数据框:
dt <- data.frame(
session_id = c("17472631", "17472632", "17472633", "17472635", "17472636", "17472638"),
Attractiveness_Real = c(-2, -2, 1, -1, 3, 1),
Calmness_Real = c(-3, 2, 3, 2, 3, -2),
Generosity_Real = rep(c(1, 3, 2), each = 2L),
Arrogance_Real = c(-2, 1, -2, -3, 3, 2),
Ambition_Real = c(-1, 1, -2, 2, 3, 1),
Charisma_Real = c(-1, -3, -3, 2, 2, 2),
Intelligence_Real = c(3, 2, 3, 2, 2, 2),
Joyfulness_Real = c(3, -3, 1, 3, 2, -2),
Friendliness_Real = c(-3, -1, -3, -2, -1, -3),
Laziness_Real = c(-1, -3, NA, -2, NA, -3),
Intelligence_Retreived = c(2, 1, NA, NA, NA, 3),
Laziness_Retreived = rep(c(-3, NA), c(1L, 5L)),
Attractiveness_Retreived = c(-2, NA, NA, NA, NA, 3),
Generosity_Retreived = c(-2, 2, 3, 2, NA, 3),
Friendliness_Retreived = c(NA, 2, -2, NA, -2, 2),
Arrogance_Retreived = c(NA, NA, NA, -1, NA, 1),
Calmness_Retreived = c(-2, NA, -1, NA, 1, 3),
Charisma_Retreived = c(1, NA, NA, 3, -1, 3),
Joyfulness_Retreived = c(NA, NA, NA, 3, NA, 3),
Ambition_Retreived = c(NA, 1, 2, NA, 2, 2),
RealAttribute_1 = c(
"Attractiveness", "Charisma", "Friendliness", "Joyfulness", "Joyfulness",
"Friendliness"
),
RealAttribute_2 = c("Calmness", "Joyfulness", "Generosity", "Charisma", "Laziness", "Arrogance"),
RealAttribute_3 = c("Generosity", "Attractiveness", "Arrogance", "Calmness", "Charisma", "Charisma"),
RealAttribute_4 = c("Arrogance", "Generosity", "Charisma", "Friendliness", "Friendliness", "Ambition"),
RealAttribute_5 = c("Ambition", "Calmness", "Ambition", "Laziness", "Arrogance", "Intelligence"),
RealAttribute_6 = c("Charisma", "Ambition", "Calmness", "Ambition", "Generosity", "Generosity"),
RealAttribute_7 = c(
"Intelligence", "Friendliness", "Intelligence", "Attractiveness",
"Attractiveness", "Laziness"
),
RealAttribute_8 = c("Joyfulness", "Arrogance", "Joyfulness", "Arrogance", "Ambition", "Attractiveness"),
RealAttribute_9 = c(
"Friendliness", "Laziness", "Attractiveness", "Generosity", "Intelligence",
"Joyfulness"
),
RealAttribute_10 = c("Laziness", "Intelligence", "Laziness", "Intelligence", "Calmness", "Calmness"),
RetrievedAttribute_1 = c(
"Intelligence", "Intelligence", "Generosity", "Joyfulness", "Laziness",
"Intelligence"
),
RetrievedAttribute_2 = c("Laziness", "Joyfulness", "Ambition", "Arrogance", "Intelligence", "Ambition"),
RetrievedAttribute_3 = c("Attractiveness", "Laziness", "Arrogance", "Charisma", "Calmness", "Generosity"),
RetrievedAttribute_4 = rep(c("Generosity", "Arrogance", "Friendliness"), 2),
RetrievedAttribute_5 = c("Friendliness", "Calmness", "Arrogance", NA, "Laziness", "Laziness"),
RetrievedAttribute_6 = c("Arrogance", "Arrogance", "Calmness", NA, "Arrogance", "Charisma"),
RetrievedAttribute_7 = c("Calmness", "Calmness", NA, NA, "Intelligence", "Attractiveness"),
RetrievedAttribute_8 = c("Charisma", "Ambition", NA, NA, "Ambition", "Arrogance"),
RetrievedAttribute_9 = c("Arrogance", "Friendliness", NA, NA, "Friendliness", "Joyfulness"),
RetrievedAttribute_10 = c("Friendliness", "Generosity", NA, NA, "Charisma", "Calmness"),
RankedAttribute_1 = c(
"Intelligence", "Intelligence", "Arrogance", "Generosity", "Laziness",
"Intelligence"
),
RankedAttribute_2 = c("Laziness", "Generosity", "Friendliness", "Intelligence", "Charisma", "Calmness"),
RankedAttribute_3 = c("Charisma", "Laziness", NA, "Gloomy/Joyful", "Intelligence", "Laziness"),
RankedAttribute_4 = c("Friendliness", "Calmness", NA, "Charisma", "Attractiveness", "Charisma"),
RankedAttribute_5 = c("Ambition", "Friendliness", NA, NA, "Friendliness", "Attractiveness"),
RankedAttribute_6 = c("Arrogance", "Attractiveness", NA, NA, NA, "Generosity"),
RankedAttribute_7 = c(NA, "Arrogance", NA, NA, NA, NA),
RankedAttribute_8 = rep(NA_character_, 6L),
RankedAttribute_9 = rep(NA_character_, 6L),
RankedAttribute_10 = rep(NA_character_, 6L),
target = c("Andy", "Daniel", "Brandon", "Jack", "Daniel", "Tyler"),
rating_target = c("8", "5", "5", "10", "10", "11 - <i>extremely like</i>")
)
str(finalDataNumeric)
'data.frame': 6 obs. of 53 variables:
session_id : chr "17472631" "17472632" "17472633" "17472635" ...
Attractiveness_Real : num -2 -2 1 -1 3 1
Calmness_Real : num -3 2 3 2 3 -2
Generosity_Real : num 1 1 3 3 2 2
Arrogance_Real : num -2 1 -2 -3 3 2
Ambition_Real : num -1 1 -2 2 3 1
Charisma_Real : num -1 -3 -3 2 2 2
Intelligence_Real : num 3 2 3 2 2 2
Joyfulness_Real : num 3 -3 1 3 2 -2
Friendliness_Real : num -3 -1 -3 -2 -1 -3
Laziness_Real : num -1 -3 NA -2 NA -3
Intelligence_Retreived : num 2 1 NA NA NA 3
Laziness_Retreived : num -3 NA NA NA NA NA
Attractiveness_Retreived: num -2 NA NA NA NA 3
Generosity_Retreived : num -2 2 3 2 NA 3
Friendliness_Retreived : num NA 2 -2 NA -2 2
Arrogance_Retreived : num NA NA NA -1 NA 1
Calmness_Retreived : num -2 NA -1 NA 1 3
Charisma_Retreived : num 1 NA NA 3 -1 3
Joyfulness_Retreived : num NA NA NA 3 NA 3
Ambition_Retreived : num NA 1 2 NA 2 2
RealAttribute_1 : chr "Attractiveness" "Charisma" "Friendliness" "Joyfulness" ...
RealAttribute_2 : chr "Calmness" "Joyfulness" "Generosity" "Charisma" ...
RealAttribute_3 : chr "Generosity" "Attractiveness" "Arrogance" "Calmness" ...
RealAttribute_4 : chr "Arrogance" "Generosity" "Charisma" "Friendliness" ...
RealAttribute_5 : chr "Ambition" "Calmness" "Ambition" "Laziness" ...
RealAttribute_6 : chr "Charisma" "Ambition" "Calmness" "Ambition" ...
RealAttribute_7 : chr "Intelligence" "Friendliness" "Intelligence" "Attractiveness" ...
RealAttribute_8 : chr "Joyfulness" "Arrogance" "Joyfulness" "Arrogance" ...
RealAttribute_9 : chr "Friendliness" "Laziness" "Attractiveness" "Generosity" ...
RealAttribute_10 : chr "Laziness" "Intelligence" "Laziness" "Intelligence" ...
RetrievedAttribute_1 : chr "Intelligence" "Intelligence" "Generosity" "Joyfulness" ...
RetrievedAttribute_2 : chr "Laziness" "Joyfulness" "Ambition" "Arrogance" ...
RetrievedAttribute_3 : chr "Attractiveness" "Laziness" "Arrogance" "Charisma" ...
RetrievedAttribute_4 : chr "Generosity" "Arrogance" "Friendliness" "Generosity" ...
RetrievedAttribute_5 : chr "Friendliness" "Calmness" "Arrogance" NA ...
RetrievedAttribute_6 : chr "Arrogance" "Arrogance" "Calmness" NA ...
RetrievedAttribute_7 : chr "Calmness" "Calmness" NA NA ...
RetrievedAttribute_8 : chr "Charisma" "Ambition" NA NA ...
RetrievedAttribute_9 : chr "Arrogance" "Friendliness" NA NA ...
RetrievedAttribute_10 : chr "Friendliness" "Generosity" NA NA ...
RankedAttribute_1 : chr "Intelligence" "Intelligence" "Arrogance" "Generosity" ...
RankedAttribute_2 : chr "Laziness" "Generosity" "Friendliness" "Intelligence" ...
RankedAttribute_3 : chr "Charisma" "Laziness" NA "Joyfulness" ...
RankedAttribute_4 : chr "Friendliness" "Calmness" NA "Charisma" ...
RankedAttribute_5 : chr "Ambition" "Friendliness" NA NA ...
RankedAttribute_6 : chr "Arrogance" "Attractiveness" NA NA ...
RankedAttribute_7 : chr NA "Arrogance" NA NA ...
RankedAttribute_8 : chr NA NA NA NA ...
RankedAttribute_9 : chr NA NA NA NA ...
RankedAttribute_10 : chr NA NA NA NA ...
target : chr "Andy" "Daniel" "Brandon" "Jack" ...
rating_target : chr "8" "5" "5" "10" ...
我想重新编码包含“Attribute*”(“RealAttribute_*”、“*RetrievedAttribute_”、“RankedAttribute_”)的每个列,以便为它们分配以它们包含的字符串开头并结束的列中的值与“_Real”。
例如,如果“RetrievedAttribute_1”在某一行中包含“Intelligence”,他们将获得该行中“Intelligence_Real”下的值。
另一个例子,仅采用“RealAttribute_”列,如果数据的前四行如下所示:
Attractiveness_Real : num -2 -2 1 -1 3 1
Calmness_Real : num -3 2 3 2 3 -2
Generosity_Real : num 1 1 3 3 2 2
Arrogance_Real : num -2 1 -2 -3 3 2
Ambition_Real : num -1 1 -2 2 3 1
Charisma_Real : num -1 -3 -3 2 2 2
Intelligence_Real : num 3 2 3 2 2 2
Joyfulness_Real : num 3 -3 1 3 2 -2
Friendliness_Real : num -3 -1 -3 -2 -1 -3
Laziness_Real : num -1 -3 NA -2 NA -3
RealAttribute_1 : chr "Attractiveness" "Charisma" "Friendliness" "Joyfulness"
RealAttribute_2 : chr "Calmness" "Joyfulness" "Generosity" "Charisma"
RealAttribute_3 : chr "Generosity" "Attractiveness" "Arrogance" "Calmness"
RealAttribute_4 : chr "Arrogance" "Generosity" "Charisma" "Friendliness" ...
RealAttribute_5 : chr "Ambition" "Calmness" "Ambition" "Laziness"
RealAttribute_6 : chr "Charisma" "Ambition" "Calmness" "Ambition"
RealAttribute_7 : chr "Intelligence" "Friendliness" "Intelligence" "Attractiveness"
RealAttribute_8 : chr "Joyfulness" "Arrogance" "Joyfulness" "Arrogance"
RealAttribute_9 : chr "Friendliness" "Laziness" "Attractiveness" "Generosity"
RealAttribute_10 : chr "Laziness" "Intelligence" "Laziness" "Intelligence"
最终结果应该是这样的:
Attractiveness_Real : num -2 -2 1 -1 3 1
Calmness_Real : num -3 2 3 2 3 -2
Generosity_Real : num 1 1 3 3 2 2
Arrogance_Real : num -2 1 -2 -3 3 2
Ambition_Real : num -1 1 -2 2 3 1
Charisma_Real : num -1 -3 -3 2 2 2
Intelligence_Real : num 3 2 3 2 2 2
Joyfulness_Real : num 3 -3 1 3 2 -2
Friendliness_Real : num -3 -1 -3 -2 -1 -3
Laziness_Real : num -1 -3 NA -2 NA -3
RealAttribute_1 : num -2 -3 -3 3
RealAttribute_2 : num -3 -3 3 2
RealAttribute_3 : num 1 -2 -2 2
RealAttribute_4 : num -2 1 -3 -2
RealAttribute_5 : num -1 2 -2 -2
RealAttribute_6 : num -1 1 3 2
RealAttribute_7 : num 3 -1 3 -1
RealAttribute_8 : num 3 1 1 -3
RealAttribute_9 : num -3 -3 1 3
RealAttribute_10 : num -1 2 NA 2
我先尝试过:
dt <- dt %>% mutate_at(vars(contains("Attribute_")), funs(. = !!paste0(., "_Real")))
并得到:
`call2()`中的错误:
! `.fn` 必须是字符串、符号、调用或函数
运行 `rlang::last_trace()` 查看错误发生的位置。
也尝试过
dt <- dt %>% mutate_at(vars(contains("Attribute_")), function(){. = !!paste0(., "_Real")})
dt <- dt %>% mutate_at(vars(contains("Attribute_")), funs(. = value[paste0(., "_Real")]))
dt <- dt %>% mutate_at(vars(contains("Attribute_")), funs(. = get(paste0(., "_Real"))))
所有返回的错误
甚至:
columns_to_recode <- grep("Attribute_", colnames(dt), value = TRUE)
for (col in columns_to_recode) {
att<-dt[[col]]
col_name <- paste0(att, "_Real")
dt[[col]] <- dt[[col_name]]
}
并且得到了
Error in .subset2(x, i, exact = exact) :
recursive indexing failed at level 2
提前致谢!
请尝试以下我测试过的代码
# get the columns that end with Real
data1 <- dt %>% select(ends_with('Real'))
# get the columns that start with Real
data2 <- dt %>% select(starts_with('Real'))
# combine the column names with values
data11 <- data1 %>% mutate(across(everything(), ~ paste(cur_column(), '##', .x)))
# replace the values of those columns that start with Real with the values of those that end with Real where the text matches
data12 <- purrr::map2_dfc(data2, data11, ~ ifelse(str_detect(trimws(str_to_lower(.x)), trimws(tolower(str_extract(.y,'.*(?=\\_)'))) ), str_extract(.y,'(?<=\\##\\s).*'), .x))
# repeat the same with Retreived
data1_re <- dt %>% select(ends_with('Retreived'))
data2_re <- dt %>% select(starts_with('Retrieved'))
data11_re <- data1_re %>% mutate(across(everything(), ~ paste(cur_column(), '##', .x)))
data12_re <- purrr::map2_dfc(data2_re, data11_re, ~ ifelse(str_detect(trimws(str_to_lower(.x)), trimws(tolower(str_extract(.y,'.*(?=\\_)'))) ), str_extract(.y,'(?<=\\##\\s).*'), .x))
# combine all the columns to create a final dataframe
final <- cbind(dt[1], dt[, endsWith(names(dt),'Real')], dt[, endsWith(names(dt),'Retreived')], data12, data12_re, dt[, startsWith(names(dt),'Ranked')], dt[, c(52,53)])
## OUTPUT
# A tibble: 6 × 10
RealAttribute_1 RealAttribute_2 RealAttribute_3 RealAttribute_4 RealAttribute_5 RealAttribute_6 RealAttribute_7 RealAttribute_8
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 -2 -3 1 -2 -1 -1 3 3
2 Charisma Joyfulness Attractiveness Generosity Calmness Ambition Friendliness Arrogance
3 Friendliness Generosity Arrogance Charisma -2 Calmness 3 1
4 Joyfulness Charisma Calmness Friendliness Laziness Ambition Attractiveness Arrogance
5 Joyfulness Laziness Charisma Friendliness Arrogance Generosity Attractiveness Ambition
6 Friendliness Arrogance Charisma Ambition Intelligence Generosity Laziness Attractiveness
# ℹ 2 more variables: RealAttribute_9 <chr>, RealAttribute_10 <chr>