R 中动态列名的值变异赋值

问题描述 投票:0回答:1

这是我的数据框:

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

提前致谢!

r dataframe recode mutate
1个回答
0
投票

请尝试以下我测试过的代码


# 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>
© www.soinside.com 2019 - 2024. All rights reserved.