R代码使用最后一列对齐所有行的长度
我有一个相当复杂和大的数据帧,我需要在R中进行数据排列。我不能想出任何可能的方法来在R中使用,所以任何帮助都将不胜感激 我的数据框架中的示例如下所示: 原始数据 现在数据必须这样完成。我想通过使用列“v8”对齐来移动所有行 需要这样做 对于NA,原始数据中有一些NA,它们都属于特定变量。 它们只能被视为价值观 有人能帮忙吗?R代码使用最后一列对齐所有行的长度,r,dataframe,alignment,multiple-columns,rows,R,Dataframe,Alignment,Multiple Columns,Rows,我有一个相当复杂和大的数据帧,我需要在R中进行数据排列。我不能想出任何可能的方法来在R中使用,所以任何帮助都将不胜感激 我的数据框架中的示例如下所示: 原始数据 现在数据必须这样完成。我想通过使用列“v8”对齐来移动所有行 需要这样做 对于NA,原始数据中有一些NA,它们都属于特定变量。 它们只能被视为价值观 有人能帮忙吗? 那将是巨大的感激 您可以使用快速脏循环来实现这一点(但根据数据集的大小,这可能效率低下) 循环的第一级遍历每一行,并检查最后一列是否包含NA值——如果是,则将所有内容滑
那将是巨大的感激 您可以使用快速脏循环来实现这一点(但根据数据集的大小,这可能效率低下) 循环的第一级遍历每一行,并检查最后一列是否包含NA值——如果是,则将所有内容滑动一次。重复此操作多次,以防数据集末尾有许多列带有NA,并且需要滑动很长的距离(使用第二级循环对数据集中的每列迭代一次;n-1次迭代就足够了)
#数据集
dat坦率地说,这不应该是一个数据框架,而应该是一个矩阵:在框架中,每一列表示有意义的东西,并且可能与相邻的列不同;在这幅数据图中,显示整数的绝对列似乎没有多大意义,即使相对位置(在一行内)有多大意义。我建议你转换成矩阵,不要把它当作一个框架
df您还可以执行以下操作:
library(tidyr)
library(dplyr)
library(stringr)
df <- data.frame(
v1=c(12,NA,22,NA),
v2=c(34,45,88,75),
v3=c(56,78,78,NA),
v4=c(78,NA,NA,44),
v5=c(NA,NA,NA,NA),
v6=c(NA,43,67,6),
v7=c(NA,52,32,NA),
v8=c(98,NA,NA,NA))
cols <- ncol(df)
df %>%
unite("id") %>%
mutate(id2 = gsub("(_NA)*$", "", id)) %>%
mutate(del_count = cols - 1 - str_count(id2, "_")) %>%
transmute(col = paste0(strrep("_", del_count), id2)) %>%
separate(col, paste0("V", 1:cols), "_")
V1 V2 V3 V4 V5 V6 V7 V8
1 12 34 56 78 NA NA NA 98
2 NA 45 78 NA NA 43 52
3 22 88 78 NA NA 67 32
4 NA 75 NA 44 NA 6
library(tidyr)
图书馆(dplyr)
图书馆(stringr)
df%
突变(id2=gsub(“(\u-NA)*$”,“”,id))%>%
突变(del_count=cols-1-str_count(id2,“)))%>%
转换(col=paste0(strrep(“,”del_count),id2))%>%
分离(列,粘贴0(“V”,1:列),“”)
V1 V2 V3 V4 V5 V6 V7 V8
112345678NA98
2 NA 45 78 NA 43 52
3 22 88 78 NA 67 32
4 NA 75 NA 44 NA 6
它为所有变量创建连接字符串,然后删除最后重复的NA
s,然后用'
分隔符填充,然后用分隔符拆分列。欢迎使用StackOverflow!请阅读相关信息以及如何给出建议。这将使其他人更容易帮助您。请不要发布代码/数据/错误的图像:它无法复制或搜索(SEO),它会破坏屏幕阅读器,并且可能不适合某些移动设备。参考:(和)。请直接包括代码或数据(例如,dput(head(x))
或data.frame(…)
),谢谢,@icecreamtouctank非常感谢!!当我转换成矩阵时,它就起作用了。但是,当我想将矩阵转换回数据帧时,数据帧看起来仍然与原始数据帧一样。您是否将t(apply(…)
的输出保存回了其他内容?R通常不会产生副作用(比如说,data.table
包除外),因此需要将函数的输出存储到变量中(相同或新)。试试mtx干杯!!终于工作了!!是的,我只是忘记了输出函数!这不仅将数字转换为字符串(可逆),而且不再区分NA
和空字符串。通常,最好不要在未指定的情况下将数字来回转换为字符串(或者转换为数字,您不需要这样做),因为很容易丢失(这些是int,不太可能丢失任何内容,但仍然非常低效).谢谢你的反馈-完全理解。非常感谢~~我只是使用单独和联合功能来安排我的数据。现在我可以把这些函数放在一起了!!
library(tidyr)
library(dplyr)
library(stringr)
df <- data.frame(
v1=c(12,NA,22,NA),
v2=c(34,45,88,75),
v3=c(56,78,78,NA),
v4=c(78,NA,NA,44),
v5=c(NA,NA,NA,NA),
v6=c(NA,43,67,6),
v7=c(NA,52,32,NA),
v8=c(98,NA,NA,NA))
cols <- ncol(df)
df %>%
unite("id") %>%
mutate(id2 = gsub("(_NA)*$", "", id)) %>%
mutate(del_count = cols - 1 - str_count(id2, "_")) %>%
transmute(col = paste0(strrep("_", del_count), id2)) %>%
separate(col, paste0("V", 1:cols), "_")
V1 V2 V3 V4 V5 V6 V7 V8
1 12 34 56 78 NA NA NA 98
2 NA 45 78 NA NA 43 52
3 22 88 78 NA NA 67 32
4 NA 75 NA 44 NA 6