重新排列行R - 但仅适用于部分列

时间:2014-07-06 12:34:46

标签: r dataframe

我试图在R中重新排列我的数据帧。我有一个数据框(称为df),如下所示,并希望移动列val_1中的所有值和第4行及以下的val_2,一行向下。

  hour  day  val_1  val_2
1    0   31   18.3    3.2
2    1   31   16.5    3.6
3    2   31   15.7    2.7
4    3   31   16.7    2.9
5    4   31   18.0    2.1
6    5   31   18.1    1.9

val_1val_2中第4行的差距应填充NAhourday下新行7中的缺失值应该具有值6(与上面的值相比增加1)和此处显示的31

  hour  day  val_1  val_2
1    0   31   18.3    3.2
2    1   31   16.5    3.6
3    2   31   15.7    2.7
4    3   31     NA     NA
5    4   31   16.7    2.9
6    5   31   18.0    2.1
7    6   31   18.1    1.9

希望你能帮帮我,所以我可以自动完成我的小任务。

更新和解决方案:

感谢Nico,我找到了解决问题的方法。我的解决方案与建议的解决方案略有不同,因为此解决方案同时向下移动val_1val_2,而不是一次移动一个。代码如下所示:

# Get row number where the new row should be placed after
row.no <- nrow(subset(df, hour <= 2))

# Create a NA row with matching column names (column val_1 and val_2 in this case)
new.row <- df[1, 3:ncol(df)]
new.row[] <- NA

# Create new value, hour and day section
values <- rbind(df[1:row.no, 3:ncol(df)],
             new.row,
             df[-1:-row.no, 3:ncol(df)]
             )
hour <- c(df$hour, df$hour[nrow(df)]+1)
day <- c(df$day, df$day[nrow(df)])

# Combine everthing again
df.new <- cbind(hour, day, values)

3 个答案:

答案 0 :(得分:1)

首先,让我们处理val_1val_2

# Note the use of negative indices to "deselect" values
val_1 <- c(df$val_1[1:3], NA, df$val_1[-1:-3])
val_2 <- c(df$val_2[1:3], NA, df$val_2[-1:-3])

现在,我们添加新的hourday

hour <- c(df$hour, df$hour[length(df$hour)]+1)
# Unclear from the question where the value for day should 
# be taken from. I am assuming the last one 
day <- c(df$day, df$day[length(df$hour)])

把所有东西放回原处

new.df <- data.frame(hour, day, val_1, val_2)

答案 1 :(得分:1)

可能的替代方法是合并expand.gridmerge,如下所示:

首先,将第3行之后的所有“小时”值增加1。

mydf$hour[-c(1:3)] <- mydf$hour[-c(1:3)]+1

其次,由于我们的“小时”列现在有差距,我们需要填写。我们可以使用seq来完成。我们还会使用expand.grid在“小时”和“日期”中创建值的所有组合,为merge提供一些内容。

merge(mydf, expand.grid(hour = seq(0, max(mydf$hour)), 
                        day = unique(mydf$day)), all = TRUE)
#   hour day val_1 val_2
# 1    0  31  18.3   3.2
# 2    1  31  16.5   3.6
# 3    2  31  15.7   2.7
# 4    3  31    NA    NA
# 5    4  31  16.7   2.9
# 6    5  31  18.0   2.1
# 7    6  31  18.1   1.9

答案 2 :(得分:0)

如果dat是数据集

 datNew <- setNames(as.data.frame(matrix(,ncol=4, nrow=nrow(dat)+1)),colnames(dat))
 datNew[dat$hour!=3,-(1:2)] <- dat[,-(1:2)]
 datNew[,1] <- (1:nrow(datNew))-1
 datNew[,2] <- dat[1,2]

  datNew

 dat1 <-  dat[c(1:3,NA,4:nrow(dat)),]
 dat1[4:nrow(dat1),1:2] <- rbind(dat1[5:nrow(dat1),1:2], dat1[nrow(dat1),1:2]+c(1,0))
 row.names(dat1) <- 1:nrow(dat1)