【问题标题】:select numeric columns and one column specified by name from data frame从数据框中选择数字列和由名称指定的一列
【发布时间】:2016-05-23 11:20:22
【问题描述】:

我有一个包含数字和非数字列的数据框,比如说

df <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20],v5=letters[1:20])

只选择我会使用的非数字列

fixCol <- !sapply(df,is.numeric)

但现在我还想包含一个特定的数字列,比如 v2。我的数据框很大,列的顺序发生了变化,所以我不能用数字索引它,我真的想用'v2'这个名字。我试过了

fixCol$v2 = TRUE

但这给了我警告In fixCol$FR = TRUE : Coercing LHS to a list,这使得我无法对我的原始数据框进行子集化以仅获得 fixCol

df[,fixCol]

给:Error in .subset(x, j) : invalid subscript type 'list'

最后,我的目标是使用类似这样的方法来缩放我的数据框中的所有数字列,除了这个指定的列之外

scaleCol = !fixCol
df_scaled = cbind(df[,fixCol], sapply(df[,scaleCol],scale))

我怎样才能最好地做到这一点?

【问题讨论】:

    标签: r scale numeric


    【解决方案1】:
    fixCol <- !sapply(df,is.numeric)
    fixCol <- df[, fixCol]
    fixCol$v2 <- df[colnames(df)=="v2"]
    head(fixCol)
     # v4 v5 v2
    #1  a  a  1
    #2  b  b  2
    #3  c  c  3
    #4  d  d  4
    #5  e  e  5
    #6  f  f  6
    

    【讨论】:

    • 谢谢,这行得通! akrun 的答案使用了更少的行,但我对两者都很满意。再次感谢!
    【解决方案2】:

    我们可以使用 OR 条件 (|) 来获取逻辑索引,然后对 'df' 的列进行子集化。

    df1 <- df[!sapply(df, is.numeric)|names(df)=='v2']
    head(df1,2)
    #  v2 v4 v5
    #1  1  a  a
    #2  2  b  b
    

    【讨论】:

    • 这很好用,谢谢!如何在不反转整个 sapply 语句的情况下制作包含所有未放入 df1 的列的 df2?我尝试了 df2
    • @Ciska 我们可以使用setdiff%in%df2 &lt;- df[setdiff(names(df), names(df1))]
    猜你喜欢
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    相关资源
    最近更新 更多