Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 通过粘贴第一行(如果不是NA)重命名列_R_Dplyr_Rename_Surveymonkey - Fatal编程技术网

R 通过粘贴第一行(如果不是NA)重命名列

R 通过粘贴第一行(如果不是NA)重命名列,r,dplyr,rename,surveymonkey,R,Dplyr,Rename,Surveymonkey,我希望在我的组织中标准化Survey Monkey的清洁导出,如果第一行不是NA,我希望将列名重命名为column name+first row name 编辑:理想情况下,这将在函数/循环中实现,以便它可以在不同大小的数据帧上工作,而无需编辑任何参数 雷普雷克斯: df <- tribble( ~`Which of these choices do you like`, ~`...1`, ~`...2`, ~`...3`, ~`Respondent ID`, ~`Different

我希望在我的组织中标准化Survey Monkey的清洁导出,如果第一行不是NA,我希望将列名重命名为column name+first row name

编辑:理想情况下,这将在函数/循环中实现,以便它可以在不同大小的数据帧上工作,而无需编辑任何参数

雷普雷克斯:

df <- tribble(
  ~`Which of these choices do you like`, ~`...1`, ~`...2`, ~`...3`, ~`Respondent ID`, ~`Different Text`, ~`...4`,
  'Fruit', 'Drink', 'Dessert', 'Snack', NA, 'Pizza Topping', 'Pizza Style',
  'Apple', 'Water', 'Pie', 'Oreos', 1234, 'Mushroom', 'Deep Dish',
  'Apple', 'Coffee', 'Cake', 'Granola', 1235, 'Onion', 'NY Style',
  'Banana', 'Coffee', 'Pie', 'Oreos', 1236, 'Mushroom', 'NY Style',
  'Pear', 'Vodka', 'Pie', 'Granola', 1237, 'Onion', 'Deep Dish'
)
在这些列被重命名之后,我会删除第一行并继续我的生活

理想情况下,我的df如下所示:

谢谢您的指导

在base R中,我们可以使用粘贴,然后删除第一行

names(df)[1:4] <- paste0(names(df)[1], unlist(df[1, 1:4]))
df <- df[-1, ]
如果我们想通过检查NA元素来实现这一点

library(dplyr)
library(tidyr)
library(purrr)
library(stringr)
keydat <- df %>%
          slice(1) %>% 
          select_if(negate(is.na)) %>%
          pivot_longer(everything()) %>%
          group_by(grp = cumsum(!startsWith(name, "..."))) %>% 
          mutate(value = sprintf("%s (%s)", first(name), value)) %>% 
          ungroup %>% 
          select(-grp)


df <- df %>%
        rename_at(vars(keydat$name), ~ keydat$value) %>%
        slice(-1)

df
# A tibble: 4 x 7
#  `Which of these… `Which of these… `Which of these… `Which of these… `Respondent ID`
#  <chr>            <chr>            <chr>            <chr>                      <dbl>
#1 Apple            Water            Pie              Oreos                       1234
#2 Apple            Coffee           Cake             Granola                     1235
#3 Banana           Coffee           Pie              Oreos                       1236
#4 Pear             Vodka            Pie              Granola                     1237
# … with 2 more variables: `Different Text (Pizza Topping)` <chr>, `Different Text (Pizza
#   Style)` <chr>

names(df)
#[1] "Which of these choices do you like (Fruit)"   "Which of these choices do you like (Drink)"  
#[3] "Which of these choices do you like (Dessert)" "Which of these choices do you like (Snack)"  
#[5] "Respondent ID"                                "Different Text (Pizza Topping)"              
#[7] "Different Text (Pizza Style)"      

这确实适用于reprex,但我希望在规模上这样做,这可能意味着不同大小的数据帧。理想情况下,我想要一个能够扫描整个数据帧而不调整任何值的函数或循环。在第一行的第一个非NA值之后,将在以下所有列上复制列名。我对您使用的很多功能都不熟悉,因此我无法真正解决问题。我感谢你迄今为止的帮助@马特不清楚这个问题。你能用一个新的例子来更新你的帖子吗issue@Matt这不是你在预期输出中想要的名称吗[1]你喜欢哪种水果哪种饮料[3]你喜欢哪种甜点哪种零食[5]响应者IDI更新了reprex以显示问题。当在第一行中找到非NA字段时,我希望从该特定列复制列+第一行。您的解决方案找到第一个非NA列名,然后将其复制到其余列。
library(dplyr)
library(tidyr)
library(purrr)
library(stringr)
keydat <- df %>%
          slice(1) %>% 
          select_if(negate(is.na)) %>%
          pivot_longer(everything()) %>%
          group_by(grp = cumsum(!startsWith(name, "..."))) %>% 
          mutate(value = sprintf("%s (%s)", first(name), value)) %>% 
          ungroup %>% 
          select(-grp)


df <- df %>%
        rename_at(vars(keydat$name), ~ keydat$value) %>%
        slice(-1)

df
# A tibble: 4 x 7
#  `Which of these… `Which of these… `Which of these… `Which of these… `Respondent ID`
#  <chr>            <chr>            <chr>            <chr>                      <dbl>
#1 Apple            Water            Pie              Oreos                       1234
#2 Apple            Coffee           Cake             Granola                     1235
#3 Banana           Coffee           Pie              Oreos                       1236
#4 Pear             Vodka            Pie              Granola                     1237
# … with 2 more variables: `Different Text (Pizza Topping)` <chr>, `Different Text (Pizza
#   Style)` <chr>

names(df)
#[1] "Which of these choices do you like (Fruit)"   "Which of these choices do you like (Drink)"  
#[3] "Which of these choices do you like (Dessert)" "Which of these choices do you like (Snack)"  
#[5] "Respondent ID"                                "Different Text (Pizza Topping)"              
#[7] "Different Text (Pizza Style)"