在R studio中有没有一个可以向上移动列的函数?

5lwkijsr  于 2023-07-31  发布在  其他
关注(0)|答案(3)|浏览(125)

更新:我有一个以阶梯格式输出的数据集。举例来说:
x1c 0d1x的数据
我希望数据从第80-88行上移到第1-8行,然后将提示前的数据放在第1行,将提示后的数据与正确的提示对齐。这个例子看起来像这样:



我希望有某种功能,我可以运行在Rstudio纠正这些问题,因为我有近200名参与者,我将不得不作出这些相同的纠正。有什么想法吗
我还没有找到一个函数,我可以向上移动一列或删除一个单元格,这将迫使数据向上。任何想法将不胜感激。

sbdsn5lh

sbdsn5lh1#

根据你对问题的解释,我认为这应该做你想做的事情:
首先,一个简化版本的数据(如果你自己包括这个,这会变得更容易):

df <- structure(list(row = 80:88, participant = c(1, 1, 1, 1, 1, 1, 
1, 1, 1), slider_header = c(9, NA, NA, NA, NA, NA, NA, NA, NA
), slider_2_header = c(NA, 2, NA, NA, NA, NA, NA, NA, NA), prompt = c("Please", 
"Do you", "Does this", "Have you", "How many", "Wjat is", "What is", 
"How man", "How many3"), slider_scale = c(NA, NA, NA, 2, NA, 
NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, -9L
))

字符串
使用tidyverse函数,我们可以通过按参与者对数据进行分组,从每个相关向量中删除前导NA值,以便所有数字都在组的第一行中,然后填充它们,以便 Dataframe 的向量都具有相同的长度(基于以下密切相关的问题:Remove leading NAs to align data):

library(tidyverse)

df %>%
    group_by(participant) %>%
    mutate(across(starts_with('slider'), ~ `length<-`(zoo::na.trim(.x), length(.x))))

  participant slider_header slider_2_header prompt    slider_scale
        <dbl>         <dbl>           <dbl> <chr>            <dbl>
1           1             9               2 Please               2
2           1            NA              NA Do you              NA
3           1            NA              NA Does this           NA
4           1            NA              NA Have you            NA
5           1            NA              NA How many            NA
6           1            NA              NA Wjat is             NA
7           1            NA              NA What is             NA
8           1            NA              NA How man             NA
9           1            NA              NA How many3           NA


通过按“参与者”分组,该过程将针对每个“参与者”单独发生。如果你想对其他变量(比如date)进行分组,只需将其添加到group_by函数中。然后我们对每个变量应用一个函数,以“slider”开始:这个函数是用~定义的,它使用zoo包中的na.trim从每个变量中删除NA,然后分配每个变量的原始长度,结果是用后面的NA填充它们,就像在你请求的数据中一样。

mgdq6dx1

mgdq6dx12#

代码的第一部分只是得到一个带有对角线值的 Dataframe

# Recreate the example data.frame
df <- data.frame(diag(c(3, 6, 7, 4, 3), 5, 5))
names(df) <- paste0("Task ", c(1:5))
        
df

# Output 
Task 1 Task 2 Task 3 Task 4 Task 5
1      3      0      0      0      0
2      0      6      0      0      0
3      0      0      7      0      0
4      0      0      0      4      0
5      0      0      0      0      3

字符串
现在这个函数读取对角线值并将它们添加到第一列中

change_df <- function(df) {
  # Get diagonal values
  values <- diag(as.matrix(df))
  # Empty data.frame
  df[,] <- 0
  df[, 1] <- values
  df
}

change_df(df)

# Output 
 Task 1 Task 2 Task 3 Task 4 Task 5
1      3      0      0      0      0
2      6      0      0      0      0
3      7      0      0      0      0
4      4      0      0      0      0
5      3      0      0      0      0

o0lyfsai

o0lyfsai3#

你还没有让它很容易帮助你,缺乏可复制的例子。但我可以说
我还没有找到一个函数,我可以向上移动一列或删除一个单元格,这将迫使数据向上。
使用dplyr::lead,将一列的全部或一部分向上滑动n个位置(dplyr::lag将向下滑动)

library(tidyverse)
(example_1 <- tibble(a=1:6,b=1:6))

#im going to slide column b up so that 456 slide up to begin after 2 rather than 3, this will leave a hole where 6 was
example_1$b[3:6] <- dplyr::lead(example_1$b[3:6],n=1)

# look at the result
example_1

字符串

相关问题