14

2 つの行を持つデータフレームがあります。

| code | name  | v1 | v2 | v3 | v4 |
|------|-------|----|----|----|----|
| 345  | Yemen | NA | 2  | 3  | NA |
| 346  | Yemen | 4  | NA | NA | 5  |

これら 2 つの行をマージする簡単な方法はありますか? 「345」を「346」に改名すると、作業が簡単になりますか?

4

2 に答える 2

11

使用できますaggregate。column に同一の値を持つ行をマージしたいと仮定しますname

aggregate(x=DF[c("v1","v2","v3","v4")], by=list(name=DF$name), min, na.rm = TRUE)
   name v1 v2 v3 v4
1 Yemen  4  2  3  5

これは SQL のようなものSELECT name, min(v1) GROUP BY nameです。min関数は任意です。 または を使用することもできます。maxこれらmeanはすべて、 NA から非 NA 値を返し、 の場合は非 NA 値を返しますna.rm = TRUE。(SQL に似たcoalesce()関数は、R に存在する方が適切に聞こえます。)

ただし、指定されたすべての非 NA 値nameが同一であるかどうかを最初に確認する必要があります。たとえば、andと compare を使用してaggregate両方を実行するか、 を使用して実行します。minmaxrange

最後に、v1-4 以外にも多くの変数がある場合はDF[,!(names(DF) %in% c("code","name"))]、列を定義するために使用できます。

于 2013-01-11T17:44:02.737 に答える