R:在表

时间:2016-05-31 09:39:24

标签: r dataframe dplyr

我的数据框X看起来像这样。它有4列5行。

姓名年龄性别班
A 12 M C1
B 10 F C2
C M C1 N / A
D F C2 N / A
E F C1 N / A

我想将所有数据从第2列(年龄)和第3行向前移动一列到右边,以便性别和类对齐,将错误填充的年龄数据留空。我的结果应该如下:

姓名年龄性别班
A 12 M C1
B 10 F C2
C N / A M C1
D N / A F C2
E N / A F C1

请注意:这是一个包含4 mil记录和52列的非常大的数据集的情况。 任何帮助都感激不尽。提前谢谢!

2 个答案:

答案 0 :(得分:5)

像这样:

nc  <- ncol(dfr)
dfr[-(1:2), 3:nc] <- dfr[-(1:2), 2:(nc-1)]
dfr[-(1:2), 2] <- NA

行中的负数指数表示除了第1行和第2行之外的所有内容。

答案 1 :(得分:1)

> df <- data.frame("name" = LETTERS[1:5], 
+            "age" = c(12, 10, "M","F","F"),
+            "gender" = c("M", "F", "C1", "C2", "C1"),
+            "class" = c("C1", "C2", NA,NA,NA))
> df
  name age gender class
1    A  12      M    C1
2    B  10      F    C2
3    C   M     C1  <NA>
4    D   F     C2  <NA>
5    E   F     C1  <NA>

> df[3:nrow(df),3:ncol(df)] <- df[3:nrow(df),2:ncol(df)]
Warning message:
In `[<-.data.frame`(`*tmp*`, 3:nrow(df), 3:ncol(df), value = list( :
provided 3 variables to replace 2 variables

> df
   name age gender class
1    A  12      M    C1
2    B  10      F    C2
3    C   M      M    C1
4    D   F      F    C2
5    E   F      F    C1
> df[3:nrow(df),2] <- NA
> df
   name  age gender class
1    A   12      M    C1
2    B   10      F    C2
3    C <NA>      M    C1
4    D <NA>      F    C2
5    E <NA>      F    C1