簡體   English   中英

從最后一行復制值並粘貼到第一行r

[英]copy value from last row and paste in to first row r

我有一個數據框。 在其中,col3和col4中的值在錯誤的行中乘以1。應該將最下面一行的值放在第一行,最上面一行的應該在第二行,依此類推。

目前

col1 col2  col3  col4
 a    b      c     d
 e     f     g     h
 i      j    k     l

應該

 col1 col2  col3  col4
  a    b      k     l
  e     f     c     d
   i    j     g     h

如何僅將col3和col4中的值向下移動,最后一個變為第一個?

我傾向於使用dplyr的mutate_eachsummarise_each功能相同的功能(S)適用於多列。 這是通過自定義“交換”功能實現更好的可讀性的方法:

library(dplyr)

定義一個函數:

swap <- function(x) c(last(x), head(x, -1L))

現在,您可以在“ mutate_each”中使用此自定義函數,並指定要將函數應用到的列:

mutate_each(df, funs(swap), col3, col4)
#  col1 col2 col3 col4
#1    a    b    k    l
#2    e    f    c    d
#3    i    j    g    h

如果您更喜歡基數R,則可以使用稍作修改的函數“ swap2”和“ lapply”將其應用於多個列,以類似的方式進行操作:

# define the function:
swap2 <- function(x) c(tail(x, 1L), head(x, -1L))
# define the columns you want to apply the function to:
cols <- c("col3", "col4")
# Finally, lapply over the data:
df[cols] <- lapply(df[cols], swap2)

數據:

> dput(df)
structure(list(col1 = c("a", "e", "i"), col2 = c("b", "f", "j"
), col3 = c("c", "g", "k"), col4 = c("d", "h", "l")), .Names = c("col1", 
"col2", "col3", "col4"), class = "data.frame", row.names = c(NA, 
-3L))

假設d是您的data.frame:

d$col3 <- c(d$col3[length(d$col3)], d$col3[-length(d$col3)])
d$col4 <- c(d$col4[length(d$col4)], d$col4[-length(d$col4)])

嘗試這個

df <- data.frame(col1=c("a", "e", "i"),
                 col2=c("b", "f", "j"),
                 col3=c("c", "g", "k"),
                 col4=c("d", "h", "l"))


df <- cbind(df[, 1:2], df[c(dim(df)[1], 1:(dim(df)[1]-1)), 3:4])

使用字符而不是因素創建數據框:

df <- data.frame(col1=c("a", "e", "i"),
                 col2=c("b", "f", "j"),
                 col3=c("c", "g", "k"),
                 col4=c("d", "h", "l"), stringsAsFactors=FALSE)

df$col3 <- c(df$col3[nrow(df)], df$col3[1:(nrow(df)-1)])
df$col4 <- c(df$col4[nrow(df)], df$col4[1:(nrow(df)-1)])

輸出:

> df
  col1 col2 col3 col4
1    a    b    k    l
2    e    f    c    d
3    i    j    g    h

假設df是您的數據幀,則可以使用for循環

temp3 = df[nrow(df),3]
temp4 = df[nrow(df),4]
for(i in 2:nrow(df)){
    df[(i,3] = df[((i - 1),3]
    df[(i,4] = df[((i - 1),4]
}
df[1, 3] = temp3
df[1, 4] = temp4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM