【问题标题】:R:: Return the First Occurence of a Variable in a Row as New ColumnR:: 将一行中第一次出现的变量作为新列返回
【发布时间】:2013-08-07 20:32:23
【问题描述】:

我一直在摸索应用功能。我有一个单字符值列表,想返回第一次提到元音。

a<- c("A","B","C","E")
b<- c("O","T","D","J")
c<- c("A","R","B","K")
d<- c("F","L","O","U")
e<- c("N","D","S","Z")

df <- data.frame(a,b,c,d,e)

我想创建一个新列,返回该行的元音的第一个实例。

vow <- c("A","E","I","O","U")

结果是(A,NA?,O,E),如果没有找到值怎么处理?

【问题讨论】:

    标签: r function character apply


    【解决方案1】:

    这很有效,如果没有找到字母,它会给你一个警告。您也可以详细说明函数来捕获它。

    apply(df, 1, function(x, vow) x[min(which(x %in% vow))], vow = vow)
    [1] "A" NA  "O" "E"
    

    【讨论】:

    • 真的很喜欢这里的简洁。这个例子我会扩展很多,最后的vow=vow有什么意义?
    • 这只是将参数显式传递给匿名函数。
    【解决方案2】:
    > m <- apply(df, 1, match, table=vow)
    > 
    > i <- apply(m, 2, function(x) na.omit(x)[1])
    > 
    > vow[i]
    [1] "A" NA  "O" "E"
    

    分三步:

    1) 对每一行应用匹配,得到一个索引表(转置!)

    2) 从每一列中获取第一个非 NA

    3) 在 vow 中查找索引

    【讨论】:

    • 这真的很有趣并且会很有用。我有时需要第二个值,这是获得这些值的完美方式。谢谢!
    • 然后将 na.omit(x)[1] 改为 [2] :)
    • 你如何获得最后一个? [-1]?
    • tail(...,1) 会这样做。 [-1] 将是除第一个之外的所有内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多