2

私はデータフレームを持っています

names <- c("doe.jane", "doe.john", "smith.bob")
number <- c(3, 5, 1)
site <- c("A1", "A1", "A2")
df <- as.data.frame(matrix(c(site, names, number), 3))
names(df) <- c("site", "names", "number")

フルネームを姓のみに置き換えてから、データフレームを折りたたむ必要があるため、出力は次のようになります

names <- c("doe", "smith")
number <- c(8, 1)
site <- c("A1", "A2")
df <- as.data.frame(matrix(c(site, names, number), 2))
names(df) <- c("site", "names", "number")
4

2 に答える 2

3

あなたはこのようなことをしたいでしょう:

last.names <- function(names) {
    names <- as.character(names)
    split.names <- strsplit(names, split='.', fixed=TRUE)
    sapply(split.names, function(x) x[1])
}

df <- within(df, names <- last.names(names))
df <- with(df, aggregate(as.numeric(number), by=list(site=site, names=names), sum))

dfの定義が少し間違っていることを指摘します。あなたは本当に言う必要がありますdf <- data.frame(names, number, site)。あなたがそれを行う方法factorは、結果の 3 つの列につながりますdata.frame

于 2012-06-24T18:40:27.627 に答える
1

これは、正規表現を使用して名前部分を取得するバージョンです。数値が要因として保存されているため、データを再作成しました - それを指摘してくれた mplourde に感謝します。

#set up the data
names <- c("doe.jane","doe.john","smith.bob")
number <- c(3,5,1)
site <- c("A1","A1","A2")
df <- data.frame(site,names,number)

#get the first part of the name
df$names <- gsub("([[:alpha:]]+)\\.([[:alpha:]]+)","\\1",df$names)
#aggregate the data by site and name
dfnew <- aggregate(df["number"],df[c("site","names")],sum)

> dfnew
  site names number
1   A1   doe      8
2   A2 smith      1
于 2012-06-24T23:06:21.963 に答える