Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:基于列名的每列不同应用函数_R_Function_Apply - Fatal编程技术网

R:基于列名的每列不同应用函数

R:基于列名的每列不同应用函数,r,function,apply,R,Function,Apply,我的数据框架结构如下: ID X1 X2 X3 X4 X5 1 1 grn gerp hrn asn bln 2 2 asn bln hgv mpl zwl 3 3 zwl mpl lwd <NA> <NA> 4 4 bln asn hrn gerp grn 5 5 lwd mpl zwl <NA> <NA> 正如您所看到的,这种方法效率很低,尤其是我必须将这种方法应用到更大的DF和40

我的数据框架结构如下:

  ID   X1   X2  X3   X4   X5
1  1  grn gerp hrn  asn  bln
2  2 asn   bln hgv  mpl  zwl
3  3  zwl  mpl lwd <NA> <NA>
4  4  bln  asn hrn gerp  grn
5  5  lwd  mpl zwl <NA> <NA>
正如您所看到的,这种方法效率很低,尤其是我必须将这种方法应用到更大的DF和400个单词的单词列表中

主要问题:(编辑:已解决)

  • 有没有一种有效的方法可以得到同样的结果
子问题:

  • 是否可以不输出TRUE或FALSE,而是输出单词在DF行中的索引
要尝试的数据帧:

    > dput(DF)
        structure(list(ID = 1:5, X1 = structure(c(3L, 1L, 5L, 2L, 4L), .Label = c("asn ", "bln", "grn", "lwd", "zwl"), class = "factor"), X2 = structure(c(3L, 2L, 4L, 1L, 4L), .Label = c("asn", "bln", "gerp", "mpl"), class = "factor"), X3 = structure(c(2L, 1L, 3L, 2L, 4L), .Label = c("hgv", "hrn", 
    "lwd", "zwl"), class = "factor"), X4 = structure(c(1L, 3L, 
    NA, 2L, NA), .Label = c("asn", "gerp", "mpl"), class = "factor"), X5 = structure(c(1L, 3L, NA, 2L, NA), .Label = c("bln", "grn", 
    "zwl"), class = "factor")), class = "data.frame", row.names = c(NA, -5L))

提前谢谢

这里是一个使用
match

t(apply(DF, 1, function(x) sapply(wordlist, function(y) 
    ifelse(is.na(match(y, x)), FALSE, TRUE))))
#       asn   bln  gerp   grn   hgv   hrn   lwd   mpl   zwl
#[1,]  TRUE  TRUE  TRUE  TRUE FALSE  TRUE FALSE FALSE FALSE
#[2,] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE  TRUE
#[3,] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE
#[4,]  TRUE  TRUE  TRUE  TRUE FALSE  TRUE FALSE FALSE FALSE
#[5,] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE
或者获取匹配单词的
DF
的列名

t(apply(DF, 1, function(x) sapply(wordlist, function(y)
    ifelse(match(y, x), paste0("X", match(y, x) - 1), NA))))
#     asn  bln  gerp grn  hgv  hrn  lwd  mpl  zwl
#[1,] "X4" "X5" "X2" "X1" NA   "X3" NA   NA   NA
#[2,] NA   "X2" NA   NA   "X3" NA   NA   "X4" "X5"
#[3,] NA   NA   NA   NA   NA   NA   "X3" "X2" "X1"
#[4,] "X2" "X1" "X4" "X5" NA   "X3" NA   NA   NA
#[5,] NA   NA   NA   NA   NA   NA   "X1" "X2" "X3"
t(apply(DF, 1, function(x) sapply(wordlist, function(y) match(y, x))))
#     asn bln gerp grn hgv hrn lwd mpl zwl
#[1,]   5   6    3   2  NA   4  NA  NA  NA
#[2,]  NA   3   NA  NA   4  NA  NA   5   6
#[3,]  NA  NA   NA  NA  NA  NA   4   3   2
#[4,]   3   2    5   6  NA   4  NA  NA  NA
#[5,]  NA  NA   NA  NA  NA  NA   2   3   4
或者获取匹配单词的
DF
中的列索引

t(apply(DF, 1, function(x) sapply(wordlist, function(y)
    ifelse(match(y, x), paste0("X", match(y, x) - 1), NA))))
#     asn  bln  gerp grn  hgv  hrn  lwd  mpl  zwl
#[1,] "X4" "X5" "X2" "X1" NA   "X3" NA   NA   NA
#[2,] NA   "X2" NA   NA   "X3" NA   NA   "X4" "X5"
#[3,] NA   NA   NA   NA   NA   NA   "X3" "X2" "X1"
#[4,] "X2" "X1" "X4" "X5" NA   "X3" NA   NA   NA
#[5,] NA   NA   NA   NA   NA   NA   "X1" "X2" "X3"
t(apply(DF, 1, function(x) sapply(wordlist, function(y) match(y, x))))
#     asn bln gerp grn hgv hrn lwd mpl zwl
#[1,]   5   6    3   2  NA   4  NA  NA  NA
#[2,]  NA   3   NA  NA   4  NA  NA   5   6
#[3,]  NA  NA   NA  NA  NA  NA   4   3   2
#[4,]   3   2    5   6  NA   4  NA  NA  NA
#[5,]  NA  NA   NA  NA  NA  NA   2   3   4

谢谢!这就解决了我问题的主要问题。@Menn0我完全错过了你问题的第二部分。请看我的最新答案。
t(apply(DF, 1, function(x) sapply(wordlist, function(y) match(y, x))))
#     asn bln gerp grn hgv hrn lwd mpl zwl
#[1,]   5   6    3   2  NA   4  NA  NA  NA
#[2,]  NA   3   NA  NA   4  NA  NA   5   6
#[3,]  NA  NA   NA  NA  NA  NA   4   3   2
#[4,]   3   2    5   6  NA   4  NA  NA  NA
#[5,]  NA  NA   NA  NA  NA  NA   2   3   4