تمرير الأعمدة إلى "مع" في lapply

كيف يمكنني تمرير أعمدة من dataframe إلى مع وظيفة في مكالمة lapply ؟

لقد حاولت هذه وأنها لا تعمل!

lapply(data[ , grepl( "Measured." , names( data ) ) ], with, (. <= 5 & . >= 1) | . == 4244)

lapply(data[ , grepl( "Measured." , names( data ) ) ], function(x) with((x <= 5 & x >= 1) | x == 4244))

أحاول معرفة ما إذا كانت القيم في المقاسة. الأعمدة بين 1 و 5 وعلاوة على ذلك 4244 هي أيضًا قبلت.

مجموعة بيانات عينة:

data <- structure(list(ID = 1:10, Date = c(2018L, 2018L, 2018L, 2015L, 
2018L, 2015L, 2015L, 2014L, 2014L, 2014L), Gender = structure(c(2L, 
2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L), .Label = c("F", "M"), class = "factor"), 
    Measured.1 = c(1L, 7L, 1L, 6L, 6L, 2L, 5L, 4L, 2L, 6L), Measured.2 = c(9L, 
    2L, 4L, 5L, 2L, 3L, 6L, 3L, 7L, 7L), Measured.3 = c(9L, 4L, 
    35L, 3L, 4L, 2L, 2L, 1L, 3L, 4L), Measured.4 = c(12L, 8L, 
    50L, 7L, 2L, 6L, 2L, 2L, 1L, 2L), Text = structure(c(1L, 
    1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L), .Label = c("N", "Y"), class = "factor"), 
    Test = c(5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L)), .Names = c("ID", 
"Date", "Gender", "Measured.1", "Measured.2", "Measured.3", "Measured.4", 
"Text", "Test"), class = "data.frame", row.names = c(NA, -10L
))

وناتجها:

   ID Date Gender Measured.1 Measured.2 Measured.3 Measured.4 Text Test
1   1 2018      M          1          9          9         12    N    5
2   2 2018      M          7          2          4          8    N    5
3   3 2018      M          1          4         35         50    N    5
4   4 2015      M          6          5          3          7    N    5
5   5 2018      M          6          2          4          2    N    5
6   6 2015      M          2          3          2          6    Y    6
7   7 2015      F          5          6          2          2    Y    6
8   8 2014      F          4          3          1          2    Y    6
9   9 2014      F          2          7          3          1    N    6
10 10 2014      F          6          7          4          2    N    6
0
griffinevo تم.
وأضاف المؤلف xeyetopewu, مصدر
أحاول معرفة ما إذا كانت القيم في المقاسة. الأعمدة بين 1 و 5 وعلاوة على ذلك 4244 هي أيضًا قبلت.
وأضاف المؤلف xeyetopewu, مصدر
هل تبحث عن التي بدلاً من مع ؟
وأضاف المؤلف Jan, مصدر
يرجى تقديم رمز لإنشاء بيانات قابلة للاستنساخ
وأضاف المؤلف griffinevo, مصدر
من الجيد أيضًا الحصول على توضيح للناتج المقصود (قم بتعديل إطار بيانات المثال يدويًا لإظهار ما ينتج عن حل العمل) - فهو يجعل الهدف أكثر وضوحًا
وأضاف المؤلف griffinevo, مصدر
إذا كنت تريد معرفة أي صفوف من البيانات إما: إدخال واحد على الأقل من "4244" في الأعمدة المقاسة أو حيث كلها تقاس الأعمدة هي> = 1 و <= 5؟
وأضاف المؤلف griffinevo, مصدر
data [data [، 1] [data [، 4]> = 1 & data [، 4] <= 5 & data [، 5]> = 1 & data [، 5] <= 5 & data [، 6]> = 1 & data [، 6] <= 5 & data [، 7]> = 1 & data [، 7] <= 5 | data [، 4] == 4244 | data [، 5] == 4244 | البيانات [، 6] == 4244 | data [، 7] == 4244]،]
وأضاف المؤلف griffinevo, مصدر
ما الذي يجب أن تقوم به وظيفتك؟ ما القيمة التي يجب إرجاعها لعمود واحد من بياناتك؟
وأضاف المؤلف jogo, مصدر
xeyetopewu هل تريد lapply (data [، grepl ("Measured."، names (data))]، function (x) ((x <= 5 & x> = 1) | x == 4244)) ؟ أو متغير mytest <- function (x) ((x <= 5 & x> = 1) | x == 4244)؛ mytest (data [، grepl ("Measured."، names (data))]) ؟
وأضاف المؤلف jogo, مصدر

2 إجابة

بصرف النظر عن القاعدة R ، يمكنك استخدام حل dplyr :

library(dplyr)
data %>%
  filter_at(vars(starts_with("Measured")), 
            any_vars((. >= 1 & . <= 5) | . == 4244))

هذا من شأنه أن يبحث عن السجلات التي يكون فيها واحد على الأقل من الأعمدة المقاسة ذات قيمة بين 1 و 5 أو 4244.
إذا كنت تريد أن تكون مقيدة وأن جميع يجب أن تكون القيم ضمن هذا النطاق ، فيمكنك تغييرها إلى:

data %>%
  filter_at(vars(starts_with("Measured")), 
            all_vars((. >= 1 & . <= 5) | . == 4244))

The fأوmer produces
   ID Date Gender Measured.1 Measured.2 Measured.3 Measured.4 Text Test
1   1 2018      M          1          9          9         12    N    5
2   2 2018      M          7          2          4          8    N    5
3   3 2018      M          1          4         35         50    N    5
4   4 2015      M          6          5          3          7    N    5
5   5 2018      M          6          2          4          2    N    5
6   6 2015      M          2          3          2          6    Y    6
7   7 2015      F          5          6          2          2    Y    6
8   8 2014      F          4          3          1          2    Y    6
9   9 2014      F          2          7          3          1    N    6
10 10 2014      F          6          7          4          2    N    6

في حين أن الغلة الأخيرة

  ID Date Gender Measured.1 Measured.2 Measured.3 Measured.4 Text Test
1  8 2014      F          4          3          1          2    Y    6

The same can be done in a much faster (but imo less readable) way with base R: You could use a base R approach with masks and apply:
# set up the cols of interest
colmask <- grepl("^Measured", names(data))

# apply the function rowwise (=1)
rowmask <- apply(data[colmask], 1, function(col) {
  any(((col >= 1 & col <= 5) | col == 4244))
})
data[rowmask,]

أو

colmask <- grepl("^Measured", names(data))
rowmask <- apply(data[colmask], 1, function(col) {
  all(((col >= 1 & col <= 5) | col == 4244))
})
data[rowmask,]

من الواضح أن هذا ينتج نفس النتائج.

0
وأضاف

باستخدام القاعدة R ، يمكنك استخراج الصفوف التي تطابق هذه المعايير على النحو التالي:

data[data[,1][data[,4] >= 1 & data[,4] <= 5 & data[,5] >= 1 & data[,5] <= 5 & data[,6] >= 1 & data[,6] <= 5 & data[,7] >= 1 & data[,7] <= 5 | data[,4] == 4244 | data[,5] == 4244 | data[,6] == 4244 | data[,7] == 4244],]

I'm using the & to create additive criteria (you're looking for rows where measured.1, measured.2, measured.3 and measured.4 are all >= 1 and <= 5) and | to create alternative criteria (any measured value is 4424):

إعطاء:

  ID Date Gender Measured.1 Measured.2 Measured.3 Measured.4 Text Test
8  8 2014      F          4          3          1          2    Y    6

انها ليست أجمل قطعة من التعليمات البرمجية ، ولكن (وفقا لميكروبماركت) هو أسرع 43x لتشغيل من نهج dplyr من يناير.

0
وأضاف
+1 لاتخاذ الطريق الصعب ولكن مع الأخذ في الاعتبار تطبيق قناع (انظر الجزء السفلي من جوابي) ، رمزك غير قابل للقراءة جدا وعرضة للخطأ في بضعة أسابيع :)
وأضاف المؤلف Jan, مصدر