我有一個與此類似的資料框(為了便于參考,我剪掉了一些,資料有 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>
我需要將列對齊,但“排名”中的某些資料偏移到左側一列。我已將有此問題的行分配給一個向量: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
非常感謝幫助!
uj5u.com熱心網友回復:
基本 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))
uj5u.com熱心網友回復:
我認為原始帖子中的嘗試很接近。要替換的列號應為 2 到ncol(df)(2-6)。這些被第 1 到ncol(df) - 1(1-5)列替換。
在移動這些特定行的值后,我可能會考慮用 替換這些行中的第一列NA,然后使用fillfromtidyr將它們替換為最后一個非缺失值。這也將處理您可能有連續偏移行的情況(如果可能的話)。
library(tidyr)
off.set.rows <- c(which(is.na(df[ , ncol(df)])))
df[off.set.rows, 2:ncol(df)] <- df[off.set.rows, 1:ncol(df)-1]
df[off.set.rows, 1] <- NA
fill(df, 1, .direction = "down")
輸出
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
4 36 (UGA) 2 1 1 4
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/352302.html
標籤:r
上一篇:RShiny:從選定行獲取資料
