1

私はこの問題の解決策をオンラインで見つけることができませんでした。これがそれです:

#Construct test dataframe 
tf <- data.frame(1:3,4:6,c("A","A","A")) 

#Try the apply function I'm trying to use
test <- apply(tf,2,function(x) if(is.numeric(x)) mean(x) else unique(x)[1]) 

#Look at the output--all columns treated as character columns...
test

#Look at the format of the original data--the first two columns are integers. 
str(tf) 

apply一般的に、行/列に含まれるデータのタイプに基づいて、行/列でどの関数を使用するかを区別したいと思います。

meanここでは、列が数値の場合は単純で、unique列が文字列の場合は最初の値が必要です。ご覧のとおり、applyこの関数を記述した方法では、すべての列を文字として扱います。

4

3 に答える 3

4

専用の関数を書いてその中に入れるだけsapplyです...使用しないでくださいapply(dtf, 2, fun)。その上、あなたのキャラクターはあなたが思うほど特徴的ではありません-走って自分の目getOption("stringsAsFactors")で確かめてください。

sapply(tf, class)
            X1.3             X4.6 c..A....A....A.. 
       "integer"        "integer"         "factor" 
sapply(tf, storage.mode)
            X1.3             X4.6 c..A....A....A.. 
       "integer"        "integer"        "integer"

編集

またはさらに良い-使用lapply

fn <- function(x) {
  if(is.numeric(x) & !is.factor(x)) {
    mean(x)
  } else if (is.character(x)) {
    unique(x)[1]
  } else if (is.factor(x)) {
    as.character(x)[1]
  }
}

dtf <- data.frame(a = 1:3, b = 4:6, c = rep("A", 3), stringsAsFactors = FALSE)
dtf2 <- data.frame(a = 1:3, b = 4:6, c = rep("A", 3), stringsAsFactors = TRUE)

as.data.frame(lapply(dtf, fn))
  a b c
1 2 5 A
as.data.frame(lapply(dtf2, fn))
  a b c
1 2 5 A 
于 2011-03-11T01:24:32.227 に答える
3

I find the numcolwise and catcolwise functions from the plyr package useful here, for a syntactically simple solution:

First let's name the columns, to avoid ugly column names when doing the aggregation:

tf <- data.frame(a = 1:3,b=4:6, d = c("A","A","A"))

Then you get your desired result with this one-liner:

> cbind(numcolwise(mean)(tf), catcolwise( function(z) unique(z)[1] )(tf))
  a b d
1 2 5 A

Explanation: numcolwise(f) converts its argument ( in this case f is the mean function ) into a function that takes a data-frame and applies f only to the numeric columns of the data-frame. Similarly the catcolwise converts its function argument to a function that operates only on the categorical columns.

于 2011-03-11T03:24:28.177 に答える
2

apply()ではなく、lapply()またはsapply()を使用する必要があります。data.frameは内部のリストであり、適用されるのは何かを行う前にマトリックスへの変換を試みます。データフレームの少なくとも1つの列は文字であるため、他のすべての列もその行列を形成する際に文字に強制されます。

于 2011-03-11T01:26:21.063 に答える