r - 将选择列向右移动一并用行号替换空格 - 1
问题描述
我有一个看起来与此类似的数据框(我已经剪掉了一些以便于参考,数据有 93 行):
Rank 1 A B C D
34 (TPE) 2 4 6 12
35 (TUR) 2 2 9 13
36 (GRE) 2 1 1 4
(UGA) 2 1 1 4 <NA>
我需要让列对齐,但“Rank”中的一些数据偏移到左侧一列。我已将存在此问题的行分配给一个向量: off.set.rows <- c(which(is.na(df[ , 6]))) 我需要让该向量中的所有行向右移动一列并将它在第 1 列中留下的空白空间替换为它之前行中第 1 列中的数字。它应该如下所示:
Rank 1 A B C D
34 (TPE) 2 4 6 12
35 (TUR) 2 2 9 13
36 (GRE) 2 1 1 4
36 (UGA) 2 1 1 4
我试过这个:df[off.set.rows, 1:(ncol(df))] <- df[off.set.rows, 2:(ncol(df))],但它会改变行中的所有内容离开一列并且 (UGA) 消失,它移动到第 5 列,然后在第 6 列中重复移动到第 2 列的值,如下所示:
Rank 1 A B C D
34 (TPE) 2 4 6 12
35 (TUR) 2 2 9 13
36 (GRE) 2 1 1 4
2 1 1 4 <NA> 2
非常感谢您的帮助!
解决方案
Base R 解决方案:它是如何工作的:
df
仅对那些满足您定义的条件的行进行子集off.set.rows
- 在开头添加一个新列
x
- 将列名粘贴
df
到x
df
将和的行绑定x
在一起- 删除符合您定义的条件的行
off.set.rows
- 用于
lag()
将上面的值添加到Rank
off.set.rows <- c(which(is.na(df[ , 6])))
x <- subset(df, rownames(df) %in% off.set.rows)
x <- cbind(new=0, x)
colnames(x) <- colnames(df)
df <- rbind(df, x[1:6])
df <- subset(df, !rownames(df) %in% off.set.rows)
df$Rank <- ifelse(df$Rank==0, lag(df$Rank), df$Rank)
Rank X1 A B C D
1 34 (TPE) 2 4 6 12
2 35 (TUR) 2 2 9 13
3 36 (GRE) 2 1 1 4
41 36 (UGA) 2 1 1 4
数据:
df <- structure(list(Rank = c("34", "35", "36", "(UGA)"), X1 = c("(TPE)",
"(TUR)", "(GRE)", "2"), A = c(2L, 2L, 2L, 1L), B = c(4L, 2L,
1L, 1L), C = c(6L, 9L, 1L, 4L), D = c(12L, 13L, 4L, NA)), class = "data.frame", row.names = c(NA,
-4L))
推荐阅读
- c++ - 如何将字符串转换为 int,如下面给出的示例
- python - 如何在 python 中使用 sqlalchemy 查询关系数据库
- javascript - 如何使用反应钩子中的函数获得价值?
- sql - SQL Server 2019 安装失败
- python - Selenium 在后续页面上找不到元素
- ibm-midrange - RPGLE as400 中的小数问题
- javascript - 循环元素中的元素
- postgresql - Spring Boot JPA - 按复合唯一列查找
- c - 如果在一个表达式中同时使用左移和右移,为什么会有所不同?
- javascript - 在 Django 模板中运行 javascript 变量