我试图在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_1
和val_2
中第4行的差距应填充NA
,hour
下day
下新行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_1
和val_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)
答案 0 :(得分:1)
首先,让我们处理val_1
和val_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])
现在,我们添加新的hour
和day
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.grid
和merge
,如下所示:
首先,将第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)